summaryrefslogtreecommitdiff
path: root/src/format/elf/helper_arm.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-10-13 23:30:30 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-10-13 23:30:30 (GMT)
commit18beadb4192144b00c06769645befb17ae1ce98e (patch)
tree9d29be95f3343bf8126ca99c42907242ceb57714 /src/format/elf/helper_arm.c
parent7800159c1dd6538f0ee9d026cf3f121a488dd647 (diff)
Kept all information about real addresses for routine symbols (ARM vs Thumb).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@593 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf/helper_arm.c')
-rw-r--r--src/format/elf/helper_arm.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/format/elf/helper_arm.c b/src/format/elf/helper_arm.c
index cd2d922..f47df5d 100644
--- a/src/format/elf/helper_arm.c
+++ b/src/format/elf/helper_arm.c
@@ -63,7 +63,9 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,
- virt_t virt; /* Adresse en mémoire virtuelle */
+ virt_t virt; /* Adresse en mémoire virtuelle*/
+ virt_t final_virt; /* Adresse virtuelle retenue */
+ bool status; /* Bilan d'une opération */
vmpa2t addr; /* Localisation d'une routine */
mrange_t range; /* Couverture mémoire associée */
GBinRoutine *routine; /* Nouvelle routine trouvée */
@@ -100,14 +102,14 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,
{
case R_ARM_JUMP_SLOT:
-
virt = ELF_SYM(format, sym, st_value);
-
-
if (virt == 0) continue;
+ final_virt = virt & ~0x1;
+
+ status = g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), final_virt, &addr);
+ if (!status) continue;
- init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
init_mrange(&range, &addr, 0);
routine = try_to_demangle_routine(name);
@@ -118,6 +120,8 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,
g_binary_symbol_attach_routine(symbol, routine);
g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol);
+ /* Comptabilisation pour le désassemblage brut */
+ g_binary_format_register_code_point(G_BIN_FORMAT(format), virt, false);
/*