diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -771,7 +771,7 @@ } } for (const Elf_Shdr &Sec : *SectionsOrErr) { - if (is_contained(Offsets, Sec.sh_offset)) + if (is_contained(Offsets, Sec.sh_addr)) Res.emplace_back(toDRI(&Sec), this); } return Res; diff --git a/llvm/test/tools/llvm-objdump/dynamic-reloc-no-dynamic.test b/llvm/test/tools/llvm-objdump/dynamic-reloc-no-dynamic.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/dynamic-reloc-no-dynamic.test @@ -0,0 +1,13 @@ +# Check that -R errors out if there is no dynamic section. +# +# RUN: yaml2obj %s > %t +# RUN: not llvm-objdump -R %t 2>&1 | FileCheck %s +# CHECK: error: not a dynamic object + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_NONE + Machine: EM_X86_64 +... diff --git a/llvm/test/tools/llvm-objdump/dynamic-reloc.test b/llvm/test/tools/llvm-objdump/dynamic-reloc.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/dynamic-reloc.test @@ -0,0 +1,31 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objdump -R %t | FileCheck %s +# +# CHECK: DYNAMIC RELOCATION RECORDS +# CHECK-NEXT: 0000000000000000 R_X86_64_RELATIVE *ABS* + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_NONE + Machine: EM_X86_64 +Sections: + - Name: .rela.dyn + Type: SHT_RELA + Info: 0 + Flags: [ SHF_ALLOC ] + Address: 0x1000 + Relocations: + - Offset: 0x0 + Type: R_X86_64_RELATIVE + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ SHF_WRITE, SHF_ALLOC ] + Address: 0x2000 + Entries: + - Tag: DT_RELA + Value: 0x1000 + - Tag: DT_NULL + Value: 0x0 +... diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1475,13 +1475,19 @@ } } +static bool hasDynamicSection(const ELFObjectFileBase &Elf) { + return llvm::any_of(Elf.sections(), [](const ELFSectionRef Sec) { + return Sec.getType() == ELF::SHT_DYNAMIC; + }); +} + void llvm::printDynamicRelocations(const ObjectFile *Obj) { // For the moment, this option is for ELF only if (!Obj->isELF()) return; const auto *Elf = dyn_cast(Obj); - if (!Elf || Elf->getEType() != ELF::ET_DYN) { + if (!Elf || !hasDynamicSection(*Elf)) { error("not a dynamic object"); return; }