diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-10-13 23:30:30 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-10-13 23:30:30 (GMT) |
commit | 18beadb4192144b00c06769645befb17ae1ce98e (patch) | |
tree | 9d29be95f3343bf8126ca99c42907242ceb57714 /src/format/elf/helper_arm.c | |
parent | 7800159c1dd6538f0ee9d026cf3f121a488dd647 (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.c | 14 |
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); /* |