[llvm] r263987 - Revert "[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."

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 21 13:59:15 PDT 2016


Author: rafael
Date: Mon Mar 21 15:59:15 2016
New Revision: 263987

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

This reverts commit r263971.
It produces the wrong results for .rela.dyn. I will add a test.

Added:
    llvm/trunk/test/Object/objdump-reloc-shared.test
Removed:
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64
    llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.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=263987&r1=263986&r2=263987&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Mon Mar 21 15:59:15 2016
@@ -640,6 +640,9 @@ 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)
@@ -679,20 +682,14 @@ ELFObjectFile<ELFT>::getRelocationSymbol
 }
 
 template <class ELFT>
-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;
+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;
 }
 
 template <class ELFT>

Added: llvm/trunk/test/Object/objdump-reloc-shared.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/objdump-reloc-shared.test?rev=263987&view=auto
==============================================================================
--- llvm/trunk/test/Object/objdump-reloc-shared.test (added)
+++ llvm/trunk/test/Object/objdump-reloc-shared.test Mon Mar 21 15:59:15 2016
@@ -0,0 +1,5 @@
+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: {{.}}

Removed: 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=263986&view=auto
==============================================================================
Binary file - no diff available.

Removed: 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=263986&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test (removed)
@@ -1,9 +0,0 @@
-// 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=263987&r1=263986&r2=263987&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Mar 21 15:59:15 2016
@@ -1188,6 +1188,10 @@ 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