From: George Rimar Date: Thu, 28 Jul 2016 07:18:23 +0000 (+0000) Subject: [ELF] - Linkerscript: ignore SORT(CONSTRUCTORS) X-Git-Tag: llvmorg-4.0.0-rc1~13986 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=03fc010e10a0882468150f729881728700e0407e;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 0c54de2..50a7b75 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -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 index 0000000..a0c23af --- /dev/null +++ b/lld/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