[ELF] Use search paths for --version-script=
Summary: This behavior matches ld.bfd -Ld --version-script=t.script a.o Reviewers: ruiu, espindola Subscribers: emaste, arichardson, llvm-commits Differential Revision: https://reviews.llvm.org/D49820 llvm-svn: 337969
This commit is contained in:
parent
33b4c8a18f
commit
c60f85d073
|
@ -939,8 +939,12 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||
Config->Undefined.push_back(Arg->getValue());
|
||||
|
||||
for (auto *Arg : Args.filtered(OPT_version_script))
|
||||
if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))
|
||||
if (Optional<std::string> Path = searchScript(Arg->getValue())) {
|
||||
if (Optional<MemoryBufferRef> Buffer = readFile(*Path))
|
||||
readVersionScript(*Buffer);
|
||||
} else {
|
||||
error(Twine("cannot find version script ") + Arg->getValue());
|
||||
}
|
||||
}
|
||||
|
||||
// Some Config members do not directly correspond to any particular
|
||||
|
@ -1022,7 +1026,7 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
|
|||
break;
|
||||
}
|
||||
case OPT_script:
|
||||
if (Optional<std::string> Path = searchLinkerScript(Arg->getValue())) {
|
||||
if (Optional<std::string> Path = searchScript(Arg->getValue())) {
|
||||
if (Optional<MemoryBufferRef> MB = readFile(*Path))
|
||||
readLinkerScript(*MB);
|
||||
break;
|
||||
|
|
|
@ -67,7 +67,7 @@ void printHelp();
|
|||
std::string createResponseFile(const llvm::opt::InputArgList &Args);
|
||||
|
||||
llvm::Optional<std::string> findFromSearchPaths(StringRef Path);
|
||||
llvm::Optional<std::string> searchLinkerScript(StringRef Path);
|
||||
llvm::Optional<std::string> searchScript(StringRef Path);
|
||||
llvm::Optional<std::string> searchLibrary(StringRef Path);
|
||||
|
||||
} // namespace elf
|
||||
|
|
|
@ -227,10 +227,10 @@ Optional<std::string> elf::searchLibrary(StringRef Name) {
|
|||
return None;
|
||||
}
|
||||
|
||||
// If a linker script doesn't exist in the current directory, we also look for
|
||||
// the script in the '-L' search paths. This matches the behaviour of both '-T'
|
||||
// and linker script INPUT() directives in ld.bfd.
|
||||
Optional<std::string> elf::searchLinkerScript(StringRef Name) {
|
||||
// If a linker/version script doesn't exist in the current directory, we also
|
||||
// look for the script in the '-L' search paths. This matches the behaviour of
|
||||
// '-T', --version-script=, and linker script INPUT() command in ld.bfd.
|
||||
Optional<std::string> elf::searchScript(StringRef Name) {
|
||||
if (fs::exists(Name))
|
||||
return Name.str();
|
||||
return findFromSearchPaths(Name);
|
||||
|
|
|
@ -344,7 +344,7 @@ void ScriptParser::readInclude() {
|
|||
return;
|
||||
}
|
||||
|
||||
if (Optional<std::string> Path = searchLinkerScript(Tok)) {
|
||||
if (Optional<std::string> Path = searchScript(Tok)) {
|
||||
if (Optional<MemoryBufferRef> MB = readFile(*Path))
|
||||
tokenize(*MB);
|
||||
return;
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
# REQUIRES: x86
|
||||
# Check that we fall back to search paths if a version script was not found
|
||||
# This behaviour matches ld.bfd.
|
||||
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
|
||||
# RUN: mkdir -p %T/searchpath
|
||||
# RUN: echo '{};' > %T/searchpath/t.script
|
||||
# RUN: ld.lld -L%T/searchpath --version-script=t.script %t.o -o /dev/null
|
||||
# RUN: not ld.lld --version-script=t.script %t.o 2>&1 | FileCheck -check-prefix ERROR %s
|
||||
# ERROR: error: cannot find version script
|
Loading…
Reference in New Issue