diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2008-09-11 22:25:26 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2008-09-11 22:25:26 (GMT) |
commit | ab1489b6a6ef1f09957f6f805f143fceb42f6a08 (patch) | |
tree | fd751d69dfde0539e9beb79cf33377572a3c36a2 /src/format | |
parent | 15387adcbd3e27fe581754c0ee56edc64272d58e (diff) |
Provided capabilities to resolve symbols for given addresses.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@29 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/e_elf.c | 46 | ||||
-rw-r--r-- | src/format/elf/e_elf.h | 2 | ||||
-rw-r--r-- | src/format/exe_format-int.h | 3 | ||||
-rw-r--r-- | src/format/exe_format.c | 22 | ||||
-rw-r--r-- | src/format/exe_format.h | 2 |
5 files changed, 75 insertions, 0 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c index 0493df8..f716846 100644 --- a/src/format/elf/e_elf.c +++ b/src/format/elf/e_elf.c @@ -60,6 +60,7 @@ elf_format *load_elf(const uint8_t *content, off_t length) EXE_FORMAT(result)->find_section = (find_section_fc)find_elf_section; EXE_FORMAT(result)->get_symbols = (get_symbols_fc)get_elf_symbols; + EXE_FORMAT(result)->resolve_symbol = (resolve_symbol_fc)resolve_elf_symbol; memcpy(&result->header, content, sizeof(Elf32_Ehdr)); @@ -114,3 +115,48 @@ size_t get_elf_symbols(const elf_format *format, char ***labels, SymbolType **ty return result; } + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* label = étiquette du symbole si trouvé. [OUT] * +* type = type du symbole trouvé. [OUT] * +* offset = adresse à cibler, puis décallage final. [OUT] * +* * +* Description : Recherche le symbole correspondant à une adresse. * +* * +* Retour : true si l'opération a été un succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool resolve_elf_symbol(const elf_format *format, char **label, SymbolType *type, uint64_t *offset) +{ + bool result; /* Bilan à retourner */ + size_t best_index; /* Meilleur symbole trouvé */ + uint64_t best_addr; /* Meilleure adresse trouvée */ + size_t i; /* Boucle de parcours */ + + best_addr = UINT64_MAX; + + for (i = 0; i < format->sym_count; i++) + if (format->symbols[i].address <= *offset && (*offset - format->symbols[i].address) < best_addr) + { + best_index = i; + best_addr = *offset - format->symbols[i].address; + } + + result = (best_addr != UINT64_MAX); + + if (result) + { + *label = strdup(format->symbols[best_index].name); + *type = STP_SECTION; + *offset -= format->symbols[best_index].address; + } + + return result; + +} diff --git a/src/format/elf/e_elf.h b/src/format/elf/e_elf.h index d4bf39b..e101fc6 100644 --- a/src/format/elf/e_elf.h +++ b/src/format/elf/e_elf.h @@ -45,6 +45,8 @@ elf_format *load_elf(const uint8_t *, off_t); /* Récupère tous les symboles présents dans le contenu binaire. */ size_t get_elf_symbols(const elf_format *, char ***, SymbolType **, uint64_t **); +/* Recherche le symbole correspondant à une adresse. */ +bool resolve_elf_symbol(const elf_format *, char **, SymbolType *, uint64_t *); diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h index b437087..d1f9381 100644 --- a/src/format/exe_format-int.h +++ b/src/format/exe_format-int.h @@ -35,6 +35,8 @@ typedef bool (* find_section_fc) (const exe_format *, const char *, off_t *, off /* Récupère tous les symboles présents dans le contenu binaire. */ typedef size_t (* get_symbols_fc) (const exe_format *, char ***, SymbolType **, uint64_t **); +/* Recherche le symbole correspondant à une adresse. */ +typedef bool (* resolve_symbol_fc) (const exe_format *, char **, SymbolType *, uint64_t *); @@ -46,6 +48,7 @@ struct _exe_format find_section_fc find_section; /* Recherche d'une section */ get_symbols_fc get_symbols; /* Liste des symboles présents */ + resolve_symbol_fc resolve_symbol; /* Recherche de symboles */ }; diff --git a/src/format/exe_format.c b/src/format/exe_format.c index 5cbaba5..1481d22 100644 --- a/src/format/exe_format.c +++ b/src/format/exe_format.c @@ -73,3 +73,25 @@ size_t get_exe_symbols(const exe_format *format, char ***labels, SymbolType **ty return format->get_symbols(format, labels, types, offsets); } + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* label = étiquette du symbole si trouvé. [OUT] * +* type = type du symbole trouvé. [OUT] * +* offset = adresse à cibler, puis décallage final. [OUT] * +* * +* Description : Recherche le symbole correspondant à une adresse. * +* * +* Retour : true si l'opération a été un succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool resolve_exe_symbol(const exe_format *format, char **label, SymbolType *type, uint64_t *offset) +{ + return format->resolve_symbol(format, label, type, offset); + +} diff --git a/src/format/exe_format.h b/src/format/exe_format.h index 3dab5a7..f859e13 100644 --- a/src/format/exe_format.h +++ b/src/format/exe_format.h @@ -50,6 +50,8 @@ bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64 /* Récupère tous les symboles présents dans le contenu binaire. */ size_t get_exe_symbols(const exe_format *, char ***, SymbolType **, uint64_t **); +/* Recherche le symbole correspondant à une adresse. */ +bool resolve_exe_symbol(const exe_format *, char **, SymbolType *, uint64_t *); |