[llvm] f80a432 - [llvm-objdump] -r: print non-SHF_ALLOC relocations for non-ET_REL files

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 1 09:08:46 PDT 2022


Author: Fangrui Song
Date: 2022-07-01T09:08:42-07:00
New Revision: f80a4321ef1bafcd8041884bcb85d9ba24335adb

URL: https://github.com/llvm/llvm-project/commit/f80a4321ef1bafcd8041884bcb85d9ba24335adb
DIFF: https://github.com/llvm/llvm-project/commit/f80a4321ef1bafcd8041884bcb85d9ba24335adb.diff

LOG: [llvm-objdump] -r: print non-SHF_ALLOC relocations for non-ET_REL files

ET_EXEC and ET_DYN files may contain non-SHF_ALLOC relocation sections
(e.g. ld --emit-relocs). Match GNU objdump by dumping them.

* Remove Object/dynamic-reloc.test. Replace it with a -r RUN line in dynamic-relocs.test
* Update relocations-in-nonreloc.test to set sh_link/sh_info. GNU
  objdump seems to ignore a SHT_REL/SHT_RELA section not linking to SHT_SYMTAB.
  The test did not test what it intended to test.

Fix https://github.com/llvm/llvm-project/issues/41246

Reviewed By: jhenderson

Differential Revision: https://reviews.llvm.org/D128959

Added: 
    llvm/test/tools/llvm-objdump/ELF/relocations-in-nonreloc.test

Modified: 
    llvm/test/tools/llvm-objdump/ELF/dynamic-relocs.test
    llvm/tools/llvm-objdump/llvm-objdump.cpp

Removed: 
    llvm/test/Object/dynamic-reloc.test
    llvm/test/tools/llvm-objdump/relocations-in-nonreloc.test


################################################################################
diff  --git a/llvm/test/Object/dynamic-reloc.test b/llvm/test/Object/dynamic-reloc.test
deleted file mode 100644
index 1b73295e6229e..0000000000000
--- a/llvm/test/Object/dynamic-reloc.test
+++ /dev/null
@@ -1,12 +0,0 @@
-RUN: llvm-readobj -r %p/Inputs/dynamic-reloc.so | FileCheck --check-prefix=READOBJ %s
-
-READOBJ:      Relocations [
-READOBJ-NEXT:   Section (4) .rela.dyn {
-READOBJ-NEXT:     0x1328 R_X86_64_RELATIVE - 0x1320
-READOBJ-NEXT:   }
-READOBJ-NEXT: ]
-
-RUN: llvm-objdump -r %p/Inputs/dynamic-reloc.so | FileCheck --check-prefix=OBJDUMP %s
-
-OBJDUMP: file format elf64-x86-64
-OBJDUMP-NOT: RELOCATION

diff  --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-relocs.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-relocs.test
index 7c695a166c832..8c1d7d16e6583 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-relocs.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-relocs.test
@@ -29,6 +29,11 @@ FileHeader:
 # CHECK-NEXT:0000000000000008 R_X86_64_NONE            foo
 #CHECK-EMPTY:
 
+## -r ignores dynamic relocations.
+# RUN: llvm-objdump -r %t2 | FileCheck %s --check-prefix=STATIC-RELOC
+
+# STATIC-RELOC-NOT: RELOCATION RECORDS
+
 --- !ELF
 FileHeader:
   Class:   ELFCLASS64

diff  --git a/llvm/test/tools/llvm-objdump/ELF/relocations-in-nonreloc.test b/llvm/test/tools/llvm-objdump/ELF/relocations-in-nonreloc.test
new file mode 100644
index 0000000000000..e3bfd427ade9d
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/relocations-in-nonreloc.test
@@ -0,0 +1,39 @@
+## Check that llvm-objdump -r prints non-SHF_ALLOC relocations.
+
+## Non-SHF_ALLOC relocations may be due to ld --emit-relocs.
+# RUN: yaml2obj -DTYPE=ET_EXEC %s -o %t1
+# RUN: llvm-objdump -r %t1 | FileCheck %s -DFILE=%t1
+# RUN: yaml2obj -DTYPE=ET_DYN %s -o %t2
+# RUN: llvm-objdump -r %t2 | FileCheck %s -DFILE=%t2
+## Non-SHF_ALLOC relocations are usually generated by compilers.
+# RUN: yaml2obj -DTYPE=ET_REL %s -o %t3
+# RUN: llvm-objdump -r %t3 | FileCheck %s -DFILE=%t3
+
+# CHECK:      [[FILE]]: file format elf64-x86-64
+# CHECK-EMPTY:
+# CHECK-NEXT: RELOCATION RECORDS FOR [.text]:
+# CHECK-NEXT: OFFSET           TYPE                     VALUE
+# CHECK-NEXT: 0000000000000123 R_X86_64_NONE            *ABS*+0x141
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    [[TYPE]]
+  Machine: EM_X86_64
+Sections:
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+  - Name:  .rela.text
+    Type:  SHT_RELA
+    Link:  .symtab
+    Info:  .text
+    Relocations:
+      - Offset: 0x123
+        Type:   R_X86_64_NONE
+        Addend: 321
+Symbols:
+  - Name:    .text
+    Type:    STT_SECTION
+    Section: .text

diff  --git a/llvm/test/tools/llvm-objdump/relocations-in-nonreloc.test b/llvm/test/tools/llvm-objdump/relocations-in-nonreloc.test
deleted file mode 100644
index e6b4e0c9b2a8e..0000000000000
--- a/llvm/test/tools/llvm-objdump/relocations-in-nonreloc.test
+++ /dev/null
@@ -1,59 +0,0 @@
-## Check that objdump doesn't print relocations in non-relocatable object files.
-
-# RUN: yaml2obj --docnum=1 %s -o %t1
-# RUN: llvm-objdump -r %t1 | FileCheck %s -DFILE=%t1 --check-prefix=FMT --implicit-check-not={{.}}
-# RUN: yaml2obj --docnum=2 %s -o %t2
-# RUN: llvm-objdump -r %t2 | FileCheck %s -DFILE=%t2 --check-prefix=FMT --implicit-check-not={{.}}
-# RUN: yaml2obj --docnum=3 %s -o %t3
-# RUN: llvm-objdump -r %t3 | FileCheck %s -DFILE=%t3 --check-prefixes=FMT,REL --implicit-check-not={{.}}
-
-# FMT: [[FILE]]: file format elf64-x86-64
-
-# REL:      RELOCATION RECORDS FOR []:
-# REL-NEXT: OFFSET           TYPE                     VALUE
-# REL-NEXT: 0000000000000123 R_X86_64_NONE            *ABS*+0x141
-
-## Executable.
---- !ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_EXEC
-  Machine: EM_X86_64
-Sections:
-  - Name: .rela.plt
-    Type: SHT_RELA
-    Relocations:
-      - Offset: 0x123
-        Type:   R_X86_64_NONE
-        Addend: 321
-
-## DSO.
---- !ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_DYN
-  Machine: EM_X86_64
-Sections:
-  - Name: .rela.plt
-    Type: SHT_RELA
-    Relocations:
-      - Offset: 0x123
-        Type:   R_X86_64_NONE
-        Addend: 321
-
-## Relocatable.
---- !ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_REL
-  Machine: EM_X86_64
-Sections:
-  - Name: .rela.plt
-    Type: SHT_RELA
-    Relocations:
-      - Offset: 0x123
-        Type:   R_X86_64_NONE
-        Addend: 321

diff  --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 132320a3cbc70..dc7083b70eb7e 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1780,10 +1780,6 @@ static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
 void objdump::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;
 
   // Build a mapping from relocation target to a vector of relocation
   // sections. Usually, there is an only one relocation section for
@@ -1791,6 +1787,8 @@ void objdump::printRelocations(const ObjectFile *Obj) {
   MapVector<SectionRef, std::vector<SectionRef>> SecToRelSec;
   uint64_t Ndx;
   for (const SectionRef &Section : ToolSectionFilter(*Obj, &Ndx)) {
+    if (Obj->isELF() && (ELFSectionRef(Section).getFlags() & ELF::SHF_ALLOC))
+      continue;
     if (Section.relocation_begin() == Section.relocation_end())
       continue;
     Expected<section_iterator> SecOrErr = Section.getRelocatedSection();


        


More information about the llvm-commits mailing list