From: Meador Inge Date: Fri, 13 Mar 2015 18:15:01 +0000 (+0000) Subject: LinkerScript: Add -T option X-Git-Tag: llvmorg-3.7.0-rc1~9310 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=84f613532fb33fa0894c5836e7b5619f15f6c321;p=platform%2Fupstream%2Fllvm.git LinkerScript: Add -T option GNU LD has an option named -T/--script which allows a user to specify a linker script to be used [1]. LLD already accepts linker scripts without this option, but the option is widely used. Therefore it is best to support it in LLD as well. [1] https://sourceware.org/binutils/docs/ld/Options.html#Options llvm-svn: 232183 --- diff --git a/lld/lib/Driver/GnuLdDriver.cpp b/lld/lib/Driver/GnuLdDriver.cpp index c20e108..7a0e633 100644 --- a/lld/lib/Driver/GnuLdDriver.cpp +++ b/lld/lib/Driver/GnuLdDriver.cpp @@ -659,7 +659,8 @@ bool GnuLdDriver::parse(int argc, const char *argv[], } case OPT_INPUT: - case OPT_l: { + case OPT_l: + case OPT_T: { bool dashL = (arg->getOption().getID() == OPT_l); StringRef path = arg->getValue(); diff --git a/lld/lib/Driver/GnuLdOptions.td b/lld/lib/Driver/GnuLdOptions.td index cf694f42..9d06f29 100644 --- a/lld/lib/Driver/GnuLdOptions.td +++ b/lld/lib/Driver/GnuLdOptions.td @@ -253,6 +253,16 @@ defm wrap : smDash<"wrap", "wrap", " will be resolved to symbol.">, MetaVarName<"">, Group; + +//===----------------------------------------------------------------------===// +/// Script Options +//===----------------------------------------------------------------------===// +def grp_scriptopts : OptionGroup<"opts">, + HelpText<"SCRIPT OPTIONS">; +defm T : smDash<"T", "script", + "Use the given linker script in place of the default script.">, + Group; + //===----------------------------------------------------------------------===// /// Optimization Options //===----------------------------------------------------------------------===// diff --git a/lld/lib/Driver/TODO.rst b/lld/lib/Driver/TODO.rst index b9752e6..e03d829 100644 --- a/lld/lib/Driver/TODO.rst +++ b/lld/lib/Driver/TODO.rst @@ -31,7 +31,6 @@ Missing Options * -s,--strip-all * -S,--strip-debug * --trace -* -T,--script * -dT,--default-script * -Ur * --unique diff --git a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp index ae995c9..721ffde 100644 --- a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -145,10 +145,10 @@ ErrorOr ELFLinkingContext::searchLibrary(StringRef libName) const { if (llvm::sys::fs::exists(path.str())) return StringRef(*new (_allocator) std::string(path.str())); } - if (!llvm::sys::fs::exists(libName)) - return make_error_code(llvm::errc::no_such_file_or_directory); + if (hasColonPrefix && llvm::sys::fs::exists(libName.drop_front())) + return libName.drop_front(); - return libName; + return make_error_code(llvm::errc::no_such_file_or_directory); } ErrorOr ELFLinkingContext::searchFile(StringRef fileName, diff --git a/lld/test/elf/linkerscript/Inputs/valid.ls b/lld/test/elf/linkerscript/Inputs/valid.ls new file mode 100644 index 0000000..4359360 --- /dev/null +++ b/lld/test/elf/linkerscript/Inputs/valid.ls @@ -0,0 +1,6 @@ +/* A simple valid linker script used for testing the -T/--script options. + * + * An unresolved symbol named '_entry_point' can be scanned for by the tests + * to determine that the linker script was processed. + */ +ENTRY(_entry_point) diff --git a/lld/test/elf/linkerscript/invalid-script-cli-1.test b/lld/test/elf/linkerscript/invalid-script-cli-1.test new file mode 100644 index 0000000..904ba17 --- /dev/null +++ b/lld/test/elf/linkerscript/invalid-script-cli-1.test @@ -0,0 +1,10 @@ +# Check that the -T/--script options issue an error when passed +# filenames for files that do not exist. + +RUN: not lld -flavor gnu -target x86_64 -T idonotexist.ls 2> %t.err +RUN: FileCheck %s < %t.err + +RUN: not lld -flavor gnu -target x86_64 --script=idonotexist.ls 2> %t.err +RUN: FileCheck %s < %t.err + +CHECK: {{.*}}lld: cannot find file {{.*}}idonotexist.ls diff --git a/lld/test/elf/linkerscript/invalid-script-cli-2.test b/lld/test/elf/linkerscript/invalid-script-cli-2.test new file mode 100644 index 0000000..6e0e42a --- /dev/null +++ b/lld/test/elf/linkerscript/invalid-script-cli-2.test @@ -0,0 +1,6 @@ +# Check that linker script are *not* picked up with -lscript.ls. + +RUN: not lld -flavor gnu -target x86_64 -L%p/Inputs/ -lvalid.ls 2> %t.err +RUN: FileCheck %s < %t.err + +CHECK: {{.*}}: Unable to find library -lvalid.ls diff --git a/lld/test/elf/linkerscript/valid-script-cli.objtxt b/lld/test/elf/linkerscript/valid-script-cli.objtxt new file mode 100644 index 0000000..b68d430 --- /dev/null +++ b/lld/test/elf/linkerscript/valid-script-cli.objtxt @@ -0,0 +1,23 @@ +# Check that the linker script inputs are accepted properly. + +# RUN: lld -flavor gnu -target x86_64 %p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor gnu -target x86_64 -T %p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor gnu -target x86_64 --script=%p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor gnu -target x86_64 -L%p/Inputs/ -l:valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +defined-atoms: + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ] + alignment: 2^4 + section-choice: custom-required + section-name: .text + +# CHECK: _entry_point