summaryrefslogtreecommitdiff
path: root/src/format/elf/e_elf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/elf/e_elf.c')
-rw-r--r--src/format/elf/e_elf.c35
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;