summaryrefslogtreecommitdiffstats
path: root/courgette/disassembler_elf_32.cc
diff options
context:
space:
mode:
authorpaulgazz@chromium.org <paulgazz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-18 22:07:53 +0000
committerpaulgazz@chromium.org <paulgazz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-18 22:07:53 +0000
commita8e80416be9ccd606ce54f7f192b91133bb23b98 (patch)
tree0972d2fe6b393a5e07e7a1267be5b616643b7eec /courgette/disassembler_elf_32.cc
parentba79a799579a5417511d472071e3f8fc5e2b67a5 (diff)
downloadchromium_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.cc29
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();