[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