[PATCH] D22848: [ELF] - Linkerscript: ignore SORT(CONSTRUCTORS)

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 27 02:29:04 PDT 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, davide, grimar, evgeny777.
Herald added a subscriber: emaste.

Some scripts can contain SORT(CONSTRUCTORS) expression:
https://svnweb.freebsd.org/base/head/sys/conf/ldscript.amd64?revision=284870&view=markup#l152

for ELF it just a nop:
"When linking object file formats which do not support arbitrary sections, such as ECOFF and XCOFF, the linker will automatically recognize C++ global constructors and destructors by name. For these object file formats, the CONSTRUCTORS command tells the linker to place constructor information in the output section where the CONSTRUCTORS command appears. **The CONSTRUCTORS command is ignored for other object file formats.**"
(http://www.sourceware.org/binutils/docs-2.10/ld_3.html)

So patch implements ignoring.

https://reviews.llvm.org/D22848

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/linkerscript-sort-constructors.s

Index: test/ELF/linkerscript/linkerscript-sort-constructors.s
===================================================================
--- test/ELF/linkerscript/linkerscript-sort-constructors.s
+++ test/ELF/linkerscript/linkerscript-sort-constructors.s
@@ -0,0 +1,5 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
+# RUN: echo "SECTIONS { .aaa : { SORT(CONSTRUCTORS) } }" > %t1.script
+# RUN: ld.lld -shared -o %t1 --script %t1.script %t1.o
+# RUN: llvm-readobj %t1 > /dev/null
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -442,6 +442,7 @@
   unsigned readPhdrType();
   void readProvide(bool Hidden);
   void readAlign(OutputSectionCommand *Cmd);
+  void readSort();
 
   Expr readExpr();
   Expr readExpr1(Expr Lhs, int MinPrec);
@@ -701,6 +702,12 @@
   expect(")");
 }
 
+void ScriptParser::readSort() {
+  expect("(");
+  expect("CONSTRUCTORS");
+  expect(")");
+}
+
 void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
   OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
   Opt.Commands.emplace_back(Cmd);
@@ -736,6 +743,8 @@
       readProvide(false);
     } else if (Tok == "PROVIDE_HIDDEN") {
       readProvide(true);
+    } else if (Tok == "SORT") {
+      readSort();
     } else {
       setError("unknown command " + Tok);
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22848.65688.patch
Type: text/x-patch
Size: 1414 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160727/145307b6/attachment.bin>


More information about the llvm-commits mailing list