diff --git a/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs-rel.test b/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs-rel.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs-rel.test @@ -0,0 +1,57 @@ +## Show that llvm-objdump can dump dynamic relocations for Elf_Rel relocations +## Previously printing the R_386_RELATIVE relocations would trigger +## error: can't read an entry at 0x40: it goes past the end of the section (0x40) + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objdump --dynamic-reloc %t | FileCheck %s +# RUN: llvm-objdump -R %t | FileCheck %s + +# CHECK: file format elf32-i386 +# CHECK-LABEL: DYNAMIC RELOCATION RECORDS +# CHECK-NEXT: 00000030 R_386_RELATIVE *ABS* +# CHECK-EMPTY + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +ProgramHeaders: + - Type: PT_LOAD + FirstSec: .rel.dyn + LastSec: .got + - Type: PT_DYNAMIC + VAddr: 0x8 + FirstSec: .dynamic + LastSec: .dynamic +Sections: + - Name: .rel.dyn + Type: SHT_REL + Flags: [ SHF_ALLOC ] + AddressAlign: 0x4 + Relocations: + - Offset: 0x30 + Type: R_386_RELATIVE + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ SHF_ALLOC ] + Link: .dynstr + AddressAlign: 0x4 + Entries: + - Tag: DT_REL + Value: 0x0 + - Tag: DT_RELSZ + Value: 0x10 + - Tag: DT_RELENT + Value: 0x8 + - Tag: DT_RELCOUNT + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 + - Name: .got + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x4 + Content: '80110000' +DynamicSymbols: [] diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -74,7 +74,10 @@ const typename ELFT::Rela *ERela = Obj->getRela(Rel); Addend = ERela->r_addend; Undef = ERela->getSymbol(false) == 0; - } else if ((*SecOrErr)->sh_type != ELF::SHT_REL) { + } else if ((*SecOrErr)->sh_type == ELF::SHT_REL) { + const typename ELFT::Rel *ERel = Obj->getRel(Rel); + Undef = ERel->getSymbol(false) == 0; + } else { return make_error(); }