Index: llvm/trunk/include/llvm/Object/ELFObjectFile.h =================================================================== --- llvm/trunk/include/llvm/Object/ELFObjectFile.h +++ llvm/trunk/include/llvm/Object/ELFObjectFile.h @@ -640,9 +640,6 @@ template section_iterator ELFObjectFile::getRelocatedSection(DataRefImpl Sec) const { - if (EF.getHeader()->e_type != ELF::ET_REL) - return section_end(); - const Elf_Shdr *EShdr = getSection(Sec); uintX_t Type = EShdr->sh_type; if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA) @@ -682,14 +679,20 @@ } template -uint64_t ELFObjectFile::getRelocationOffset(DataRefImpl Rel) const { - assert(EF.getHeader()->e_type == ELF::ET_REL && - "Only relocatable object files have relocation offsets"); - const Elf_Shdr *sec = getRelSection(Rel); - if (sec->sh_type == ELF::SHT_REL) - return getRel(Rel)->r_offset; - - return getRela(Rel)->r_offset; +uint64_t ELFObjectFile::getRelocationOffset(DataRefImpl Rel) const { + const Elf_Shdr *sec = getRelSection(Rel); + uint64_t Offset = sec->sh_type == ELF::SHT_REL ? + getRel(Rel)->r_offset : + getRela(Rel)->r_offset; + if (EF.getHeader()->e_type == ELF::ET_EXEC || + EF.getHeader()->e_type == ELF::ET_DYN) { + // For an executable file or a shared object, the value is the virtual + // address of the storage unit affected by the relocation. + auto SectionIter = getRelocatedSection(toDRI(sec)); + if (SectionIter != section_end()) + Offset -= SectionIter->getAddress(); + } + return Offset; } template Index: llvm/trunk/test/Object/objdump-reloc-shared.test =================================================================== --- llvm/trunk/test/Object/objdump-reloc-shared.test +++ llvm/trunk/test/Object/objdump-reloc-shared.test @@ -1,5 +0,0 @@ -RUN: llvm-objdump -r %p/Inputs/elf-reloc-no-sym.x86_64 \ -RUN: | FileCheck %s - -; CHECK: elf-reloc-no-sym.x86_64: file format ELF64-x86-64 -; CHECK-NOT: {{.}} Index: llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test =================================================================== --- llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test +++ llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test @@ -0,0 +1,9 @@ +// This test checks that relocation in nonrelocatable files are printed +// RUN: llvm-objdump -r %p/Inputs/relocations-in-nonrelocatable.elf-x86_64 | FileCheck %s + +// (main.c) +// void g(void){} +// int main(void) { g(); }; +// gcc main.c -o main -Wl,--emit-relocs + +CHECK: 00000000000000f8 R_X86_64_PC32 g-4-P \ No newline at end of file Index: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp @@ -1188,10 +1188,6 @@ void llvm::PrintRelocations(const ObjectFile *Obj) { StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; - // Regular objdump doesn't print relocations in non-relocatable object - // files. - if (!Obj->isRelocatableObject()) - return; for (const SectionRef &Section : ToolSectionFilter(*Obj)) { if (Section.relocation_begin() == Section.relocation_end())