[llvm] r263971 - [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.

Colin LeMahieu via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 21 12:14:50 PDT 2016


Author: colinl
Date: Mon Mar 21 14:14:50 2016
New Revision: 263971

URL: http://llvm.org/viewvc/llvm-project?rev=263971&view=rev
Log:
[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

Added:
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64   (with props)
    llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test
Removed:
    llvm/trunk/test/Object/objdump-reloc-shared.test
Modified:
    llvm/trunk/include/llvm/Object/ELFObjectFile.h
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp

Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=263971&r1=263970&r2=263971&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Mon Mar 21 14:14:50 2016
@@ -640,9 +640,6 @@ ELFObjectFile<ELFT>::section_rel_end(Dat
 template <class ELFT>
 section_iterator
 ELFObjectFile<ELFT>::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<ELFT>::getRelocationSymbol
 }
 
 template <class ELFT>
-uint64_t ELFObjectFile<ELFT>::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<ELFT>::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 <class ELFT>

Removed: llvm/trunk/test/Object/objdump-reloc-shared.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/objdump-reloc-shared.test?rev=263970&view=auto
==============================================================================
--- llvm/trunk/test/Object/objdump-reloc-shared.test (original)
+++ llvm/trunk/test/Object/objdump-reloc-shared.test (removed)
@@ -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: {{.}}

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64?rev=263971&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test?rev=263971&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test Mon Mar 21 14:14:50 2016
@@ -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

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=263971&r1=263970&r2=263971&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Mar 21 14:14:50 2016
@@ -1188,10 +1188,6 @@ static void DisassembleObject(const Obje
 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())




More information about the llvm-commits mailing list