[lld] r295385 - Merge reloc sections in -emit-reloc mode.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 16 16:28:18 PST 2017


Author: rafael
Date: Thu Feb 16 18:28:17 2017
New Revision: 295385

URL: http://llvm.org/viewvc/llvm-project?rev=295385&view=rev
Log:
Merge reloc sections in -emit-reloc mode.

Without this we would produce two relocation sections pointing to the
same section, which gnu tools reject.

This fixes pr31986.

The implementation of -r/--emit-reloc is getting fairly
complicated. But lets get the test passing before trying to refactor
it.

Added:
    lld/trunk/test/ELF/emit-relocs-merge.s
Modified:
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=295385&r1=295384&r2=295385&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Thu Feb 16 18:28:17 2017
@@ -98,6 +98,15 @@ StringRef elf::getOutputSectionName(Stri
   if (Config->Relocatable)
     return Name;
 
+  if (Config->EmitRelocs) {
+    for (StringRef V : {".rel.", ".rela."}) {
+      if (Name.startswith(V)) {
+        StringRef Inner = getOutputSectionName(Name.substr(V.size() - 1));
+        return Saver.save(Twine(V.drop_back()) + Inner);
+      }
+    }
+  }
+
   for (StringRef V :
        {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.",
         ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",

Added: lld/trunk/test/ELF/emit-relocs-merge.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/emit-relocs-merge.s?rev=295385&view=auto
==============================================================================
--- lld/trunk/test/ELF/emit-relocs-merge.s (added)
+++ lld/trunk/test/ELF/emit-relocs-merge.s Thu Feb 16 18:28:17 2017
@@ -0,0 +1,20 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld --emit-relocs %t.o -o %t.so -shared
+# RUN: llvm-readobj -r %t.so | FileCheck %s
+
+# CHECK:       Relocations [
+# CHECK-NEXT:    Section ({{.*}}) .rela.dyn {
+# CHECK-NEXT:     0x1000 R_X86_64_64 zed 0x0
+# CHECK-NEXT:     0x1008 R_X86_64_64 zed 0x0
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Section ({{.*}}) .rela.data {
+# CHECK-NEXT:     0x1000 R_X86_64_64 zed 0x0
+# CHECK-NEXT:     0x1008 R_X86_64_64 zed 0x0
+# CHECK-NEXT:   }
+# CHECK-NEXT: ]
+
+.section        .data.foo,"aw",%progbits
+.quad zed
+.section        .data.bar,"aw",%progbits
+.quad zed




More information about the llvm-commits mailing list