[PATCH] D30530: [ELF] - Implemented -znotext

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 7 01:59:45 PST 2017


grimar updated this revision to Diff 90824.
grimar retitled this revision from "[ELF] - Implemented -z text/-znotext" to "[ELF] - Implemented -znotext".
grimar edited the summary of this revision.
grimar added a comment.

- Addressed review comments.


https://reviews.llvm.org/D30530

Files:
  ELF/Config.h
  ELF/Driver.cpp
  ELF/Relocations.cpp
  ELF/SyntheticSections.cpp
  test/ELF/ztext-text-notext.s


Index: test/ELF/ztext-text-notext.s
===================================================================
--- test/ELF/ztext-text-notext.s
+++ test/ELF/ztext-text-notext.s
@@ -0,0 +1,15 @@
+# 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-readobj  -dynamic-table -r %t | FileCheck %s
+
+# CHECK:      Relocations [
+# CHECK-NEXT:    Section {{.*}} .rela.dyn {
+# CHECK-NEXT:      0x1000 R_X86_64_RELATIVE - 0x1000
+# CHECK-NEXT:    }
+# CHECK-NEXT:  ]
+# CHECK: DynamicSection [
+# CHECK: 0x0000000000000016 TEXTREL 0x0
+
+foo:
+.quad foo
Index: ELF/SyntheticSections.cpp
===================================================================
--- ELF/SyntheticSections.cpp
+++ ELF/SyntheticSections.cpp
@@ -1114,6 +1114,8 @@
   add({DT_SYMENT, sizeof(Elf_Sym)});
   add({DT_STRTAB, In<ELFT>::DynStrTab});
   add({DT_STRSZ, In<ELFT>::DynStrTab->getSize()});
+  if (!Config->ZText)
+    add({DT_TEXTREL, (uint64_t)0});
   if (In<ELFT>::GnuHashTab)
     add({DT_GNU_HASH, In<ELFT>::GnuHashTab});
   if (In<ELFT>::HashTab)
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -517,11 +517,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<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));
+    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));
     return Expr;
   }
   if (Body.getVisibility() != STV_DEFAULT) {
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -599,6 +599,7 @@
   Config->ZOrigin = hasZOption(Args, "origin");
   Config->ZRelro = !hasZOption(Args, "norelro");
   Config->ZStackSize = getZOptionValue(Args, "stack-size", 0);
+  Config->ZText = !hasZOption(Args, "notext");
   Config->ZWxneeded = hasZOption(Args, "wxneeded");
 
   if (Config->LTOO > 3)
Index: ELF/Config.h
===================================================================
--- ELF/Config.h
+++ ELF/Config.h
@@ -142,6 +142,7 @@
   bool ZNow;
   bool ZOrigin;
   bool ZRelro;
+  bool ZText;
   bool ExitEarly;
   bool ZWxneeded;
   DiscardPolicy Discard;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D30530.90824.patch
Type: text/x-patch
Size: 2928 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170307/7b01b523/attachment.bin>


More information about the llvm-commits mailing list