[lld] r297789 - Don't create copy relocs or dummy plt's if given -z notext.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 14 15:50:07 PDT 2017


Author: rafael
Date: Tue Mar 14 17:50:07 2017
New Revision: 297789

URL: http://llvm.org/viewvc/llvm-project?rev=297789&view=rev
Log:
Don't create copy relocs or dummy plt's if given -z notext.

Being passed -z notext is a pretty strong indication that the user is
OK with text relocations. This is not the same behavior as bfd, but
bfd defaults to -z notext, so it has to try to avoid text relocations
and use them as a last resort.

Added:
    lld/trunk/test/ELF/Inputs/ztext-text-notext.s
Modified:
    lld/trunk/ELF/Relocations.cpp
    lld/trunk/test/ELF/ztext-text-notext.s

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=297789&r1=297788&r2=297789&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Tue Mar 14 17:50:07 2017
@@ -520,12 +520,11 @@ static RelExpr adjustExpr(const elf::Obj
   // 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
   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);

Added: lld/trunk/test/ELF/Inputs/ztext-text-notext.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/ztext-text-notext.s?rev=297789&view=auto
==============================================================================
--- lld/trunk/test/ELF/Inputs/ztext-text-notext.s (added)
+++ lld/trunk/test/ELF/Inputs/ztext-text-notext.s Tue Mar 14 17:50:07 2017
@@ -0,0 +1,10 @@
+        .global bar
+        .type bar, @object
+        .size bar, 8
+bar:
+        .quad 0
+
+        .global zed
+        .type zed, @function
+zed:
+        nop

Modified: lld/trunk/test/ELF/ztext-text-notext.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/ztext-text-notext.s?rev=297789&r1=297788&r2=297789&view=diff
==============================================================================
--- lld/trunk/test/ELF/ztext-text-notext.s (original)
+++ lld/trunk/test/ELF/ztext-text-notext.s Tue Mar 14 17:50:07 2017
@@ -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 - .




More information about the llvm-commits mailing list