| 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); | 
| -    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)) | 
|  |