summaryrefslogtreecommitdiff
path: root/src/format/elf
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2008-10-30 18:35:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2008-10-30 18:35:47 (GMT)
commit7c7109c1a8aaedea40af4b96d4b81d6ba4496226 (patch)
tree471709f8bccae04f492d03017a1e94d0ca48b962 /src/format/elf
parent8a30afc05eed869865ba4dc9c107119f7ec00fe4 (diff)
Displayed all found strings on binary loading.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@40 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf')
-rw-r--r--src/format/elf/e_elf.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c
index a9eacea..48b4455 100644
--- a/src/format/elf/e_elf.c
+++ b/src/format/elf/e_elf.c
@@ -35,6 +35,13 @@
+/* S'assure qu'une chaîne de caractère tient sur une ligne. */
+extern char *escape_crlf_bin_string(char *);
+
+
+/* Récupère tous les éléments identifiées dans le binaire. */
+size_t get_elf_resolved_items(const elf_format *, char ***, ResolvedType **, uint64_t **);
+
@@ -73,6 +80,7 @@ elf_format *load_elf(const uint8_t *content, off_t length)
EXE_FORMAT(result)->get_def_parts = (get_def_parts_fc)get_elf_default_code_parts;
EXE_FORMAT(result)->find_section = (find_section_fc)find_elf_section_content_by_name;
EXE_FORMAT(result)->get_symbols = (get_symbols_fc)get_elf_symbols;
+ EXE_FORMAT(result)->get_resolved = (get_resolved_fc)get_elf_resolved_items;
EXE_FORMAT(result)->resolve_symbol = (resolve_symbol_fc)resolve_elf_symbol;
memcpy(&result->header, content, sizeof(Elf32_Ehdr));
@@ -264,6 +272,57 @@ size_t get_elf_symbols(const elf_format *format, char ***labels, SymbolType **ty
/******************************************************************************
* *
+* Paramètres : format = informations chargées à consulter. *
+* labels = liste des commentaires à insérer. [OUT] *
+* types = type des symboles listés. [OUT] *
+* offsets = liste des indices des commentaires. [OUT] *
+* *
+* Description : Récupère tous les éléments identifiées dans le binaire. *
+* *
+* Retour : Nombre d'éléments mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t get_elf_resolved_items(const elf_format *format, char ***labels, ResolvedType **types, uint64_t **offsets)
+{
+ size_t result; /* Quantité à retourner */
+ size_t i; /* Boucle de parcours */
+ size_t start; /* Point de départ du tour */
+
+ result = format->sym_count + format->str_count;
+
+ *labels = (char **)calloc(result, sizeof(char *));
+ *types = (SymbolType *)calloc(result, sizeof(SymbolType));
+ *offsets = (uint64_t *)calloc(result, sizeof(uint64_t));
+
+ for (i = 0; i < format->sym_count; i++)
+ {
+ (*labels)[i] = strdup(format->symbols[i].name);
+ (*types)[i] = RTP_SECTION;
+ (*offsets)[i] = format->symbols[i].address;
+ }
+
+ start = format->sym_count;
+
+ for (i = 0; i < format->str_count; i++)
+ {
+ (*labels)[start + i] = strndup(format->strings[i].value, format->strings[i].len);
+ (*types)[start + i] = RTP_STRING;
+ (*offsets)[start + i] = format->strings[i].vaddress;
+
+ (*labels)[start + i] = escape_crlf_bin_string((*labels)[start + i]);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* label = étiquette du symbole si trouvé. [OUT] *
* type = type du symbole trouvé. [OUT] *