Chromium Code Reviews| Index: courgette/disassembler_elf_32.cc |
| diff --git a/courgette/disassembler_elf_32.cc b/courgette/disassembler_elf_32.cc |
| index c0f42e61052244b544cf882f4dcddb9ce57a584b..84aa971d1b264c92132c9255481e5fe7253e7a6e 100644 |
| --- a/courgette/disassembler_elf_32.cc |
| +++ b/courgette/disassembler_elf_32.cc |
| @@ -162,24 +162,21 @@ CheckBool DisassemblerElf32::IsValidRVA(RVA rva) const { |
| return false; |
| } |
| -// Returns RVA for an in memory address, or NULL. |
| -CheckBool DisassemblerElf32::RVAToFileOffset(Elf32_Addr addr, |
| - size_t* result) const { |
| - |
| - for (int i = 0; i < ProgramSegmentHeaderCount(); i++) { |
| - Elf32_Addr begin = ProgramSegmentMemoryBegin(i); |
|
Will Harris
2016/02/04 18:54:21
are ProgramSegmentMemoryBegin and ProgramSegmentMe
huangs
2016/02/04 20:13:50
Ah good catch. Also removing other unused accesso
|
| - Elf32_Addr end = begin + ProgramSegmentMemorySize(i); |
| - |
| - if (addr >= begin && addr < end) { |
| - Elf32_Addr offset = addr - begin; |
| +CheckBool DisassemblerElf32::RVAToFileOffset(RVA rva, |
| + size_t* result) const { |
| + for (int i = 0; i < SectionHeaderCount(); i++) { |
| + const Elf32_Shdr *section_header = SectionHeader(i); |
| + // These can appear to have a size in the file, but don't. |
| + if (section_header->sh_type == SHT_NOBITS) |
| + continue; |
| + Elf32_Addr begin = section_header->sh_addr; |
| + Elf32_Addr end = begin + section_header->sh_size; |
| - if (offset < ProgramSegmentFileSize(i)) { |
| - *result = ProgramSegmentFileOffset(i) + offset; |
| - return true; |
| - } |
| + if (rva >= begin && rva < end) { |
| + *result = section_header->sh_offset + (rva - begin); |
| + return true; |
| } |
| } |
| - |
| return false; |
| } |
| @@ -491,7 +488,9 @@ CheckBool DisassemblerElf32::ParseRel32RelocsFromSections() { |
| const Elf32_Shdr *section_header = SectionHeader(section_id); |
| - if (section_header->sh_type != SHT_PROGBITS) |
| + // Some debug sections can have sh_type=SHT_PROGBITS but sh_addr=0. |
| + if (section_header->sh_type != SHT_PROGBITS || |
| + section_header->sh_addr == 0) |
| continue; |
| if (!ParseRel32RelocsFromSection(section_header)) |