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,146 @@ +## 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: 00002182 R_386_RELATIVE *ABS* +# CHECK-NEXT: 000031f0 R_386_RELATIVE *ABS* +# CHECK-EMPTY + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 + Entry: 0x2180 +ProgramHeaders: + - Type: PT_PHDR + Flags: [ PF_R ] + VAddr: 0x34 + Align: 0x4 + - Type: PT_LOAD + Flags: [ PF_R ] + FirstSec: .dynsym + LastSec: .rel.dyn + Align: 0x1000 + - Type: PT_LOAD + Flags: [ PF_X, PF_W, PF_R ] + FirstSec: .foobar + LastSec: .foobar + VAddr: 0x2180 + Align: 0x1000 + - Type: PT_LOAD + Flags: [ PF_W, PF_R ] + FirstSec: .dynamic + LastSec: .got + VAddr: 0x3188 + Align: 0x1000 + - Type: PT_DYNAMIC + Flags: [ PF_W, PF_R ] + FirstSec: .dynamic + LastSec: .dynamic + VAddr: 0x3188 + Align: 0x4 + - Type: PT_GNU_RELRO + Flags: [ PF_R ] + FirstSec: .dynamic + LastSec: .got + VAddr: 0x3188 + - Type: PT_GNU_STACK + Flags: [ PF_W, PF_R ] + Align: 0x0 +Sections: + - Name: .dynsym + Type: SHT_DYNSYM + Flags: [ SHF_ALLOC ] + Address: 0x134 + Link: .dynstr + AddressAlign: 0x4 + Offset: 0x134 + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + Address: 0x16C + AddressAlign: 0x1 + - Name: .rel.dyn + Type: SHT_REL + Flags: [ SHF_ALLOC ] + Address: 0x170 + Link: .dynsym + AddressAlign: 0x4 + Relocations: + - Offset: 0x2182 + Type: R_386_RELATIVE + - Offset: 0x31F0 + Type: R_386_RELATIVE + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1180 + AddressAlign: 0x4 + - Name: .foobar + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x2180 + AddressAlign: 0x1 + Content: 8B1DF0310000 + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ SHF_WRITE, SHF_ALLOC ] + Address: 0x3188 + Link: .dynstr + AddressAlign: 0x4 + Entries: + - Tag: DT_FLAGS_1 + Value: 0x8000000 + - Tag: DT_DEBUG + Value: 0x0 + - Tag: DT_REL + Value: 0x170 + - Tag: DT_RELSZ + Value: 0x10 + - Tag: DT_RELENT + Value: 0x8 + - Tag: DT_RELCOUNT + Value: 0x2 + - Tag: DT_SYMTAB + Value: 0x134 + - Tag: DT_SYMENT + Value: 0x10 + - Tag: DT_STRTAB + Value: 0x16C + - Tag: DT_STRSZ + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 + - Name: .got + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + Address: 0x31F0 + AddressAlign: 0x4 + Content: '80110000' + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x1 + EntSize: 0x1 + Content: 4C4C4420312E3000 +Symbols: + - Name: foo + Section: .text + Value: 0x1180 + - Name: _DYNAMIC + Section: .dynamic + Value: 0x3188 + Other: [ STV_HIDDEN ] + - Name: _start + Section: .foobar + Binding: STB_GLOBAL + Value: 0x2180 +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(); }