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,62 @@ +## Show that llvm-objdump can dump dynamic relocations for Elf_Rel relocations +## where the relocation references a symbol and where it does not. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objdump --dynamic-reloc %t | FileCheck %s +# RUN: llvm-objdump -R %t | FileCheck %s + +# CHECK: DYNAMIC RELOCATION RECORDS +# CHECK-NEXT: 00000030 R_386_RELATIVE *ABS* +# CHECK-NEXT: 00000010 R_386_NONE foo +# CHECK-EMPTY: + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +ProgramHeaders: + - Type: PT_LOAD + FirstSec: .rel.dyn + LastSec: .data + - Type: PT_DYNAMIC + VAddr: 0x10 + FirstSec: .dynamic + LastSec: .dynamic +Sections: + - Name: .rel.dyn + Type: SHT_REL + Link: .dynsym + Flags: [ SHF_ALLOC ] + AddressAlign: 0x4 + Relocations: + - Offset: 0x30 + Type: R_386_RELATIVE + - Offset: 0x10 + Symbol: foo + Type: R_386_NONE + - 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: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x4 + Content: '80110000' +DynamicSymbols: + - Name: foo + Section: .data diff --git a/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test b/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test --- a/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test +++ b/llvm/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test @@ -3,14 +3,14 @@ ## properly identify relocation tables. # RUN: yaml2obj %s -o %t -# RUN: llvm-objdump --dynamic-reloc %t | FileCheck --implicit-check-not=R_X86 %s -# RUN: llvm-objdump -R %t | FileCheck --implicit-check-not=R_X86 %s +# RUN: llvm-objdump --dynamic-reloc %t | FileCheck %s +# RUN: llvm-objdump -R %t | FileCheck %s -# CHECK: file format elf64-x86-64 # CHECK: DYNAMIC RELOCATION RECORDS # CHECK-NEXT: 0000000000000000 R_X86_64_RELATIVE *ABS* # CHECK-NEXT: 0000000000000000 R_X86_64_JUMP_SLOT bar # CHECK-NEXT: 0000000000000008 R_X86_64_NONE foo +# CHECK-EMPTY: --- !ELF FileHeader: @@ -50,7 +50,7 @@ Flags: [SHF_ALLOC] Relocations: - Offset: 0 - Symbol: 2 # bar + Symbol: bar Type: R_X86_64_JUMP_SLOT - Name: .rel.dyn Type: SHT_REL @@ -61,7 +61,7 @@ Flags: [SHF_ALLOC] Relocations: - Offset: 8 - Symbol: 1 # foo + Symbol: foo Type: R_X86_64_NONE - Name: .dynamic Type: SHT_DYNAMIC 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(); }