[ELF] - Linkerscript: ignore SORT(CONSTRUCTORS)
authorGeorge Rimar <grimar@accesssoftek.com>
Thu, 28 Jul 2016 07:18:23 +0000 (07:18 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Thu, 28 Jul 2016 07:18:23 +0000 (07:18 +0000)
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.

Differential revision: https://reviews.llvm.org/D22848

llvm-svn: 276965

lld/ELF/LinkerScript.cpp
lld/test/ELF/linkerscript/linkerscript-sort-constructors.s [new file with mode: 0644]

index 0c54de2..50a7b75 100644 (file)
@@ -442,6 +442,7 @@ private:
   unsigned readPhdrType();
   void readProvide(bool Hidden);
   void readAlign(OutputSectionCommand *Cmd);
+  void readSort();
 
   Expr readExpr();
   Expr readExpr1(Expr Lhs, int MinPrec);
@@ -701,6 +702,12 @@ void ScriptParser::readAlign(OutputSectionCommand *Cmd) {
   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 @@ void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
       readProvide(false);
     } else if (Tok == "PROVIDE_HIDDEN") {
       readProvide(true);
+    } else if (Tok == "SORT") {
+      readSort();
     } else {
       setError("unknown command " + Tok);
     }
diff --git a/lld/test/ELF/linkerscript/linkerscript-sort-constructors.s b/lld/test/ELF/linkerscript/linkerscript-sort-constructors.s
new file mode 100644 (file)
index 0000000..a0c23af
--- /dev/null
@@ -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