[ELF] - Linkerscript: ignore SORT(CONSTRUCTORS)

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
This commit is contained in:
George Rimar 2016-07-28 07:18:23 +00:00
parent 8af38ecaa3
commit 03fc010e10
2 changed files with 14 additions and 0 deletions

View 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);
}

View File

@ -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