mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 23:49:22 +08:00
lld: use modern library search ordering
This merges the static and shared library and behaves as if `-search_paths_first` was specified which is also the default behaviour on ld64 (and now lld). Unify the paths, and use `llvm::sys::path` to deal with the path to be truly agnostic to the host.
This commit is contained in:
@@ -73,21 +73,18 @@ opt::InputArgList MachOOptTable::parse(ArrayRef<const char *> argv) {
|
||||
return args;
|
||||
}
|
||||
|
||||
// This is for -lfoo. We'll look for libfoo.dylib from search paths.
|
||||
static Optional<std::string> findDylib(StringRef name) {
|
||||
for (StringRef dir : config->searchPaths) {
|
||||
std::string path = (dir + "/lib" + name + ".dylib").str();
|
||||
if (fs::exists(path))
|
||||
return path;
|
||||
}
|
||||
return None;
|
||||
}
|
||||
static Optional<std::string> findLibrary(StringRef name) {
|
||||
std::string shared = (llvm::Twine("lib") + name + ".dylib").str();
|
||||
std::string archive = (llvm::Twine("lib") + name + ".a").str();
|
||||
llvm::SmallString<260> location;
|
||||
|
||||
static Optional<std::string> findArchive(StringRef name) {
|
||||
for (StringRef dir : config->searchPaths) {
|
||||
std::string path = (dir + "/lib" + name + ".a").str();
|
||||
if (fs::exists(path))
|
||||
return path;
|
||||
for (StringRef library : {shared, archive}) {
|
||||
location = dir;
|
||||
llvm::sys::path::append(location, library);
|
||||
if (fs::exists(location))
|
||||
return location.str().str();
|
||||
}
|
||||
}
|
||||
return None;
|
||||
}
|
||||
@@ -296,12 +293,11 @@ bool macho::link(llvm::ArrayRef<const char *> argsArr, bool canExitEarly,
|
||||
break;
|
||||
case OPT_l: {
|
||||
StringRef name = arg->getValue();
|
||||
if (Optional<std::string> path = findDylib(name))
|
||||
if (Optional<std::string> path = findLibrary(name)) {
|
||||
addFile(*path);
|
||||
else if (Optional<std::string> path = findArchive(name))
|
||||
addFile(*path);
|
||||
else
|
||||
error("library not found for -l" + name);
|
||||
break;
|
||||
}
|
||||
error("library not found for -l" + name);
|
||||
break;
|
||||
}
|
||||
case OPT_platform_version: {
|
||||
|
||||
43
lld/test/MachO/link-search-order.s
Normal file
43
lld/test/MachO/link-search-order.s
Normal file
@@ -0,0 +1,43 @@
|
||||
# REQUIRES: x86
|
||||
|
||||
# RUN: mkdir -p %t
|
||||
#
|
||||
# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libhello.s -o %t/hello.o
|
||||
# RUN: lld -flavor darwinnew -dylib -install_name @executable_path/libhello.dylib %t/hello.o -o %t/libhello.dylib
|
||||
#
|
||||
# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libgoodbye.s -o %t/goodbye.o
|
||||
# RUN: lld -flavor darwinnew -dylib -install_name @executable_path/libgoodbye.dylib %t/goodbye.o -o %t/libgoodbye.dylib
|
||||
# RUN: llvm-ar --format=darwin crs %t/libgoodbye.a %t/goodbye.o
|
||||
#
|
||||
# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %s -o %t/test.o
|
||||
# RUN: lld -flavor darwinnew -o %t/test -Z -L%t -lhello -lgoodbye %t/test.o
|
||||
#
|
||||
# RUN: llvm-objdump --macho --dylibs-used %t/test | FileCheck %s
|
||||
|
||||
# CHECK: @executable_path/libhello.dylib
|
||||
# CHECK: @executable_path/libgoodbye.dylib
|
||||
# CHECK: /usr/lib/libSystem.B.dylib
|
||||
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
||||
_main:
|
||||
movl $0x2000004, %eax # write()
|
||||
mov $1, %rdi # stdout
|
||||
movq _hello_world@GOTPCREL(%rip), %rsi
|
||||
mov $13, %rdx # length
|
||||
syscall
|
||||
|
||||
movl $0x2000004, %eax # write()
|
||||
mov $1, %rdi # stdout
|
||||
movq _hello_its_me@GOTPCREL(%rip), %rsi
|
||||
mov $15, %rdx # length
|
||||
syscall
|
||||
|
||||
movl $0x2000004, %eax # write()
|
||||
mov $1, %rdi # stdout
|
||||
movq _goodbye_world@GOTPCREL(%rip), %rsi
|
||||
mov $15, %rdx # length
|
||||
syscall
|
||||
mov $0, %rax
|
||||
ret
|
||||
Reference in New Issue
Block a user