[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