[PATCH] D83469: [LLD][ELF] - Allow relocation sections to appear before their target sections.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 9 03:16:03 PDT 2020


grimar created this revision.
grimar added reviewers: jhenderson, MaskRay.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: espindola.

It allows handling cases when we have SHT_REL[A] sections before target
sections in objects.

This fixes https://bugs.llvm.org/show_bug.cgi?id=46632

which says: "Normally it is not what compilers would emit. We have to support it,
because some custom tools might want to use this feature, which is not restricted by ELF gABI"


https://reviews.llvm.org/D83469

Files:
  lld/ELF/InputFiles.cpp
  lld/test/ELF/reloc-sec-before-target.test


Index: lld/test/ELF/reloc-sec-before-target.test
===================================================================
--- /dev/null
+++ lld/test/ELF/reloc-sec-before-target.test
@@ -0,0 +1,33 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: ld.lld -shared %t.o -o %t
+# RUN: llvm-readelf --relocs %t | FileCheck %s
+
+## In this case we have an object with a relocation section before
+## the corresponding relocatable target section. Normally it is not what
+## compilers would emit. We have to support it, because some custom tools might
+## want to use this feature, which is not restricted by ELF gABI.
+
+## Check we handle the relocation properly.
+# CHECK:      Relocation section '.rela.dyn' at offset 0x238 contains 1 entries:
+# CHECK-NEXT:     Offset             Info             Type    Symbol's Value  Symbol's Name + Addend
+# CHECK-NEXT: 00000000000022f0  0000000100000001 R_X86_64_64 0000000000000000 foo + 0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name:  .rela.data
+    Type:  SHT_RELA
+    Info:  .data
+    Relocations:
+      - Symbol: foo
+        Type:   R_X86_64_64
+  - Name:  .data
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+Symbols:
+  - Name:    foo
+    Binding: STB_GLOBAL
Index: lld/ELF/InputFiles.cpp
===================================================================
--- lld/ELF/InputFiles.cpp
+++ lld/ELF/InputFiles.cpp
@@ -632,6 +632,8 @@
       break;
     case SHT_SYMTAB:
     case SHT_STRTAB:
+    case SHT_REL:
+    case SHT_RELA:
     case SHT_NULL:
       break;
     default:
@@ -639,11 +641,23 @@
     }
   }
 
-  // This block handles SHF_LINK_ORDER.
+  // We have the second loop. It is used to:
+  // 1) handle SHF_LINK_ORDER sections.
+  // 2) create SHT_REL[A] sections. In a specific case it might be possible
+  // to have a relocatable section that follows the corresponding relocation
+  // section. In this case the relocation section references the target
+  // section that is not yet created and we error out. For simplicity of
+  // implementation, we do not implement the creation of sections on demand.
   for (size_t i = 0, e = objSections.size(); i < e; ++i) {
     if (this->sections[i] == &InputSection::discarded)
       continue;
     const Elf_Shdr &sec = objSections[i];
+
+    // Create SHT_REL[A] sections.
+    if (sec.sh_type == SHT_REL || sec.sh_type == SHT_RELA)
+      this->sections[i] = createInputSection(sec);
+
+    // This block handles SHF_LINK_ORDER.
     if (!(sec.sh_flags & SHF_LINK_ORDER))
       continue;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83469.276685.patch
Type: text/x-patch
Size: 2595 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200709/6866c50e/attachment.bin>


More information about the llvm-commits mailing list