diff options
Diffstat (limited to 'src/format/elf/e_elf.c')
-rw-r--r-- | src/format/elf/e_elf.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c index 081e245..a91e279 100644 --- a/src/format/elf/e_elf.c +++ b/src/format/elf/e_elf.c @@ -513,7 +513,7 @@ size_t get_elf_resolved_items(const elf_format *format, char ***labels, Resolved { (*labels)[start + i] = strndup(format->strings[i].value, format->strings[i].len); (*types)[start + i] = RTP_STRING; - (*offsets)[start + i] = format->strings[i].vaddress; + (*offsets)[start + i] = format->strings[i].address; (*labels)[start + i] = escape_crlf((*labels)[start + i]); @@ -526,10 +526,10 @@ size_t get_elf_resolved_items(const elf_format *format, char ***labels, Resolved /****************************************************************************** * * -* 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] * +* Paramètres : format = informations chargées à consulter. * +* label = étiquette du symbole si trouvé. [OUT] * +* type = type du symbole trouvé. [OUT] * +* address = adresse à cibler, puis décallage final. [OUT] * * * * Description : Recherche le symbole correspondant à une adresse. * * * @@ -539,35 +539,42 @@ size_t get_elf_resolved_items(const elf_format *format, char ***labels, Resolved * * ******************************************************************************/ -bool resolve_elf_symbol(const elf_format *format, char **label, SymbolType *type, uint64_t *offset) +bool resolve_elf_symbol(const elf_format *format, char **label, SymbolType *type, vmpa_t *address) { bool result; /* Bilan à retourner */ size_t best_index; /* Meilleur symbole trouvé */ - uint64_t best_addr; /* Meilleure adresse trouvée */ + vmpa_t best_addr; /* Meilleure adresse trouvée */ + vmpa_t addr; /* Adresse de routine */ size_t i; /* Boucle de parcours */ - if (resolve_elf_strings(format, label, offset)) + if (resolve_elf_strings(format, label, address)) { *type = STP_STRING; return true; } - best_addr = UINT64_MAX; + best_index = format->routines_count; /* Pour GCC */ + best_addr = UINT64_MAX; /* FIXME */ - for (i = 0; i < format->sym_count; i++) - if (format->symbols[i].address <= *offset && (*offset - format->symbols[i].address) < best_addr) + for (i = 0; i < format->routines_count; i++) + { + addr = g_binary_routine_get_address(format->routines[i]); + + if (addr <= *address && (*address - addr) < best_addr) { best_index = i; - best_addr = *offset - format->symbols[i].address; + best_addr = *address - addr; } + } + result = (best_addr != UINT64_MAX); if (result) { - *label = strdup(format->symbols[best_index].name); + *label = strdup(g_binary_routine_get_name(format->routines[best_index])); *type = STP_SECTION; - *offset -= format->symbols[best_index].address; + *address -= g_binary_routine_get_address(format->routines[best_index]); } return result; |