diff options
author | paulgazz@chromium.org <paulgazz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-18 22:07:53 +0000 |
---|---|---|
committer | paulgazz@chromium.org <paulgazz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-18 22:07:53 +0000 |
commit | a8e80416be9ccd606ce54f7f192b91133bb23b98 (patch) | |
tree | 0972d2fe6b393a5e07e7a1267be5b616643b7eec /courgette/disassembler_elf_32.cc | |
parent | ba79a799579a5417511d472071e3f8fc5e2b67a5 (diff) | |
download | chromium_src-a8e80416be9ccd606ce54f7f192b91133bb23b98.zip chromium_src-a8e80416be9ccd606ce54f7f192b91133bb23b98.tar.gz chromium_src-a8e80416be9ccd606ce54f7f192b91133bb23b98.tar.bz2 |
Fixed Courgette to correctly regenerate the ELF relocation table for
ARM binaries.
Note for reviewers:
Don: general courgette correctness
Ben: style, correctness
BUG=258648
Review URL: https://chromiumcodereview.appspot.com/19022007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212449 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'courgette/disassembler_elf_32.cc')
-rw-r--r-- | courgette/disassembler_elf_32.cc | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/courgette/disassembler_elf_32.cc b/courgette/disassembler_elf_32.cc index bd49ff1..91ccd45 100644 --- a/courgette/disassembler_elf_32.cc +++ b/courgette/disassembler_elf_32.cc @@ -427,7 +427,7 @@ CheckBool DisassemblerElf32::ParseAbs32Relocs() { // Quite a few of these conversions fail, and we simply skip // them, that's okay. - if (RelToRVA(relocs_table[rel_id], &rva)) + if (RelToRVA(relocs_table[rel_id], &rva) && CheckSection(rva)) abs32_locations_.push_back(rva); } } @@ -437,6 +437,33 @@ CheckBool DisassemblerElf32::ParseAbs32Relocs() { return true; } +CheckBool DisassemblerElf32::CheckSection(RVA rva) { + size_t offset; + + if (!RVAToFileOffset(rva, &offset)) { + return false; + } + + for (int section_id = 0; + section_id < SectionHeaderCount(); + section_id++) { + + const Elf32_Shdr *section_header = SectionHeader(section_id); + + if (offset >= section_header->sh_offset && + offset < (section_header->sh_offset + section_header->sh_size)) { + switch (section_header->sh_type) { + case SHT_REL: + // Fall-through + case SHT_PROGBITS: + return true; + } + } + } + + return false; +} + CheckBool DisassemblerElf32::ParseRel32RelocsFromSections() { rel32_locations_.clear(); |