[PATCH] D30256: [ELF] - Implemented -z noreloc-overflow.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 22 07:53:43 PST 2017
grimar updated this revision to Diff 89363.
grimar added a comment.
- Fixed misypes in comment.
https://reviews.llvm.org/D30256
Files:
ELF/Config.h
ELF/Driver.cpp
ELF/Relocations.cpp
test/ELF/znoreloc-overflow.s
Index: test/ELF/znoreloc-overflow.s
===================================================================
--- test/ELF/znoreloc-overflow.s
+++ test/ELF/znoreloc-overflow.s
@@ -0,0 +1,21 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld --no-dynamic-linker -z noreloc-overflow %t.o -o %t -pie
+# RUN: llvm-readobj -r %t | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section {{.*}} .rela.dyn {
+# CHECK-NEXT: 0x1000 R_X86_64_RELATIVE - 0x1000
+# CHECK-NEXT: 0x1004 R_X86_64_RELATIVE - 0x1000
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# RUN: not ld.lld -z noreloc-overflow %t.o -o %t -pie 2>&1 \
+# RUN: | FileCheck %s --check-prefix=ERR
+# ERR: -z noreloc-overflow may not be used without --no-dynamic-linker
+
+.text
+.global _start
+_start:
+ .long _start
+ .quad _start
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -528,11 +528,12 @@
// only memory. We can hack around it if we are producing an executable and
// the refered symbol can be preemepted to refer to the executable.
if (Config->Shared || (Config->pic() && !isRelExpr(Expr))) {
- error(S.getLocation(RelOff) + ": can't create dynamic relocation " +
- toString(Type) + " against " +
- (Body.getName().empty() ? "local symbol in readonly segment"
- : "symbol '" + toString(Body) + "'") +
- " defined in " + toString(Body.File));
+ if (!Config->ZNorelocOverflow)
+ error(S.getLocation(RelOff) + ": can't create dynamic relocation " +
+ toString(Type) + " against " +
+ (Body.getName().empty() ? "local symbol in readonly segment"
+ : "symbol '" + toString(Body) + "'") +
+ " defined in " + toString(Body.File));
return Expr;
}
if (Body.getVisibility() != STV_DEFAULT) {
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -234,6 +234,14 @@
if (Config->Pie)
error("-r and -pie may not be used together");
}
+
+ // -z noreloc-overflow is a specific feature used in kernels. When it is
+ // enabled, we may emit a dynamic relocation against RO segment. In that
+ // case we would need to add DT_TEXTREL flag to prepare runtime linker.
+ // Though noreloc-overflow is usually used for producing self-relocatable
+ // output which avoid use of dynamic linker.
+ if (Config->ZNorelocOverflow && !Args.hasArg(OPT_no_dynamic_linker))
+ error("-z noreloc-overflow may not be used without --no-dynamic-linker");
}
static StringRef getString(opt::InputArgList &Args, unsigned Key,
@@ -576,6 +584,7 @@
Config->ZExecstack = hasZOption(Args, "execstack");
Config->ZNocopyreloc = hasZOption(Args, "nocopyreloc");
Config->ZNodelete = hasZOption(Args, "nodelete");
+ Config->ZNorelocOverflow = hasZOption(Args, "noreloc-overflow");
Config->ZNow = hasZOption(Args, "now");
Config->ZOrigin = hasZOption(Args, "origin");
Config->ZRelro = !hasZOption(Args, "norelro");
Index: ELF/Config.h
===================================================================
--- ELF/Config.h
+++ ELF/Config.h
@@ -138,6 +138,7 @@
bool ZExecstack;
bool ZNocopyreloc;
bool ZNodelete;
+ bool ZNorelocOverflow;
bool ZNow;
bool ZOrigin;
bool ZRelro;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D30256.89363.patch
Type: text/x-patch
Size: 3446 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170222/a036232f/attachment.bin>
More information about the llvm-commits
mailing list