From: Colin LeMahieu Date: Mon, 21 Mar 2016 19:14:50 +0000 (+0000) Subject: [llvm-objdump] Printing relocations in executable and shared object files. This... X-Git-Tag: llvmorg-3.9.0-rc1~11325 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cdaf644c48d9f4deceb3afe6ee94a122fd3fc188;p=platform%2Fupstream%2Fllvm.git [llvm-objdump] Printing relocations in executable and shared object files. This partially reverts r215844 by removing test objdump-reloc-shared.test which stated GNU objdump doesn't print relocations, it does. In executable and shared object ELF files, relocations in the file contain the final virtual address rather than section offset so this is adjusted to display section offset. Differential revision: http://reviews.llvm.org/D15965 llvm-svn: 263971 --- diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index b01fa1d..5ee90ee 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -640,9 +640,6 @@ ELFObjectFile::section_rel_end(DataRefImpl Sec) const { 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 @@ ELFObjectFile::getRelocationSymbol(DataRefImpl Rel) const { } 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 diff --git a/llvm/test/Object/objdump-reloc-shared.test b/llvm/test/Object/objdump-reloc-shared.test deleted file mode 100644 index d899ffb..0000000 --- a/llvm/test/Object/objdump-reloc-shared.test +++ /dev/null @@ -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: {{.}} diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64 new file mode 100644 index 0000000..bb706c9 Binary files /dev/null and b/llvm/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64 differ diff --git a/llvm/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test b/llvm/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test new file mode 100644 index 0000000..4860b91 --- /dev/null +++ b/llvm/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 diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index f436183..7f49efd 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1188,10 +1188,6 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { 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())