[lld] r295772 - Add `-z nocopyreloc` option.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 21 13:41:50 PST 2017


Author: ruiu
Date: Tue Feb 21 15:41:50 2017
New Revision: 295772

URL: http://llvm.org/viewvc/llvm-project?rev=295772&view=rev
Log:
Add `-z nocopyreloc` option.

This option disable creating copy relocations. ld.bfd and ld.gold
have the same option.

Added:
    lld/trunk/test/ELF/relocation-nocopy.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Relocations.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=295772&r1=295771&r2=295772&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Tue Feb 21 15:41:50 2017
@@ -136,6 +136,7 @@ struct Configuration {
   bool WarnMissingEntry;
   bool ZCombreloc;
   bool ZExecstack;
+  bool ZNocopyreloc;
   bool ZNodelete;
   bool ZNow;
   bool ZOrigin;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=295772&r1=295771&r2=295772&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Feb 21 15:41:50 2017
@@ -574,6 +574,7 @@ void LinkerDriver::readConfigs(opt::Inpu
 
   Config->ZCombreloc = !hasZOption(Args, "nocombreloc");
   Config->ZExecstack = hasZOption(Args, "execstack");
+  Config->ZNocopyreloc = hasZOption(Args, "nocopyreloc");
   Config->ZNodelete = hasZOption(Args, "nodelete");
   Config->ZNow = hasZOption(Args, "now");
   Config->ZOrigin = hasZOption(Args, "origin");

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=295772&r1=295771&r2=295772&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Tue Feb 21 15:41:50 2017
@@ -543,8 +543,14 @@ static RelExpr adjustExpr(const elf::Obj
   if (Body.isObject()) {
     // Produce a copy relocation.
     auto *B = cast<SharedSymbol<ELFT>>(&Body);
-    if (!B->NeedsCopy)
+    if (!B->NeedsCopy) {
+      if (Config->ZNocopyreloc)
+        error(S.getLocation(RelOff) + ": unresolvable relocation " + toString(Type)
+              + " against symbol '" + toString(*B) +
+              "'; recompile with -fPIC or remove '-z nocopyreloc'");
+
       addCopyRelSymbol(B);
+    }
     return Expr;
   }
   if (Body.isFunc()) {

Added: lld/trunk/test/ELF/relocation-nocopy.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocation-nocopy.s?rev=295772&view=auto
==============================================================================
--- lld/trunk/test/ELF/relocation-nocopy.s (added)
+++ lld/trunk/test/ELF/relocation-nocopy.s Tue Feb 21 15:41:50 2017
@@ -0,0 +1,19 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/relocation-copy.s -o %t2.o
+// RUN: ld.lld -shared %t2.o -o %t.so
+// RUN: not ld.lld -z nocopyreloc %t.o %t.so -o %t3 2>&1 | FileCheck %s
+
+// CHECK: unresolvable relocation R_X86_64_32S against symbol 'x'
+// CHECK: unresolvable relocation R_X86_64_32S against symbol 'y'
+// CHECK: unresolvable relocation R_X86_64_32S against symbol 'z'
+
+.text
+.global _start
+_start:
+movl $5, x
+movl $7, y
+movl $9, z
+movl $x, %edx
+movl $y, %edx
+movl $z, %edx




More information about the llvm-commits mailing list