Fix library search order.

Previously, we searched for a .so file from all library paths and
then searched for a .a file. That logic is wrong. What we need to
do is to look for a .so and a .a for each library path.

llvm-svn: 273846
This commit is contained in:
Rui Ueyama 2016-06-27 07:26:28 +00:00
parent 7357849dca
commit 20d8d55b05
2 changed files with 15 additions and 4 deletions

View File

@ -244,12 +244,17 @@ std::string elf::findFromSearchPaths(StringRef Path) {
std::string elf::searchLibrary(StringRef Path) {
if (Path.startswith(":"))
return findFromSearchPaths(Path.substr(1));
if (!Config->Static) {
std::string S = findFromSearchPaths(("lib" + Path + ".so").str());
if (!S.empty())
for (StringRef Dir : Config->SearchPaths) {
if (!Config->Static) {
std::string S = buildSysrootedPath(Dir, ("lib" + Path + ".so").str());
if (fs::exists(S))
return S;
}
std::string S = buildSysrootedPath(Dir, ("lib" + Path + ".a").str());
if (fs::exists(S))
return S;
}
return findFromSearchPaths(("lib" + Path + ".a").str());
return "";
}
// Makes a path by concatenating Dir and File.

View File

@ -44,6 +44,12 @@
// RUN: ld.lld -o %t3 %t.o -L%t.dir -lls
// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=DYNAMIC %s
// Check for library search order
// RUN: mkdir -p %t.dir2
// RUN: cp %t.dir/libls.a %t.dir2
// RUN: ld.lld -o %t3 %t.o -L%t.dir2 -L%t.dir -lls
// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=STATIC %s
// -L can be placed after -l
// RUN: ld.lld -o %t3 %t.o -lls -L%t.dir