summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Relocations.cpp13
-rw-r--r--lld/test/ELF/Inputs/ztext-text-notext.s10
-rw-r--r--lld/test/ELF/ztext-text-notext.s23
3 files changed, 39 insertions, 7 deletions
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 7d39b08eeff..7fbcea1a26a 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -520,12 +520,11 @@ static RelExpr adjustExpr(const elf::ObjectFile<ELFT> &File, SymbolBody &Body,
// 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))) {
- if (Config->ZText)
- error(S.getLocation<ELFT>(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));
+ error(S.getLocation<ELFT>(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) {
@@ -655,6 +654,8 @@ static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) {
typedef typename ELFT::uint uintX_t;
bool IsWrite = C.Flags & SHF_WRITE;
+ if (!Config->ZText)
+ IsWrite = true;
auto AddDyn = [=](const DynamicReloc<ELFT> &Reloc) {
In<ELFT>::RelaDyn->addReloc(Reloc);
diff --git a/lld/test/ELF/Inputs/ztext-text-notext.s b/lld/test/ELF/Inputs/ztext-text-notext.s
new file mode 100644
index 00000000000..f66b3ee1e29
--- /dev/null
+++ b/lld/test/ELF/Inputs/ztext-text-notext.s
@@ -0,0 +1,10 @@
+ .global bar
+ .type bar, @object
+ .size bar, 8
+bar:
+ .quad 0
+
+ .global zed
+ .type zed, @function
+zed:
+ nop
diff --git a/lld/test/ELF/ztext-text-notext.s b/lld/test/ELF/ztext-text-notext.s
index cdd5b67d6ad..964ffe1fa6d 100644
--- a/lld/test/ELF/ztext-text-notext.s
+++ b/lld/test/ELF/ztext-text-notext.s
@@ -1,15 +1,36 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-# RUN: ld.lld -z notext %t.o -o %t -shared
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/ztext-text-notext.s -o %t2.o
+# RUN: ld.lld %t2.o -o %t2.so -shared
+# RUN: ld.lld -z notext %t.o %t2.so -o %t -shared
# RUN: llvm-readobj -dynamic-table -r %t | FileCheck %s
+# RUN: ld.lld -z notext %t.o %t2.so -o %t2 -pie
+# RUN: llvm-readobj -dynamic-table -r %t2 | FileCheck %s
+# RUN: ld.lld -z notext %t.o %t2.so -o %t3
+# RUN: llvm-readobj -dynamic-table -r %t3 | FileCheck --check-prefix=STATIC %s
+
+# If the preference is to have text relocations, don't create plt of copy relocations.
# CHECK: Relocations [
# CHECK-NEXT: Section {{.*}} .rela.dyn {
# CHECK-NEXT: 0x1000 R_X86_64_RELATIVE - 0x1000
+# CHECK-NEXT: 0x1008 R_X86_64_64 bar 0x0
+# CHECK-NEXT: 0x1010 R_X86_64_PC64 zed 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK: DynamicSection [
# CHECK: 0x0000000000000016 TEXTREL 0x0
+# STATIC: Relocations [
+# STATIC-NEXT: Section {{.*}} .rela.dyn {
+# STATIC-NEXT: 0x201008 R_X86_64_64 bar 0x0
+# STATIC-NEXT: 0x201010 R_X86_64_PC64 zed 0x0
+# STATIC-NEXT: }
+# STATIC-NEXT: ]
+# STATIC: DynamicSection [
+# STATIC: 0x0000000000000016 TEXTREL 0x0
+
foo:
.quad foo
+.quad bar
+.quad zed - .
OpenPOWER on IntegriCloud