[PATCH] D81124: lld: use modern library search ordering
Saleem Abdulrasool via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 16:35:32 PDT 2020
compnerd created this revision.
compnerd added reviewers: smeenai, int3, lld-macho.
compnerd added a project: lld.
Herald added a project: LLVM.
This merges the static and shared library and behaves as if
`-search_paths_first` was specified which is also the default beahviour
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D81124
Files:
lld/MachO/Driver.cpp
lld/test/MachO/link-search-order.s
Index: lld/test/MachO/link-search-order.s
===================================================================
--- /dev/null
+++ lld/test/MachO/link-search-order.s
@@ -0,0 +1,39 @@
+# RUN: mkdir -p %t
+# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libhello.s -o %t/hello.o
+# 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/libhello.dylib %t/hello.o -o %t/libhello.dylib
+# 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
+
+# REQUIRES: x86
+
+# 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 at GOTPCREL(%rip), %rsi
+ mov $13, %rdx # length
+ syscall
+
+ movl $0x2000004, %eax # write()
+ mov $1, %rdi # stdout
+ movq _hello_its_me at GOTPCREL(%rip), %rsi
+ mov $15, %rdx # length
+ syscall
+
+ movl $0x2000004, %eax # write()
+ mov $1, %rdi # stdout
+ movq _goodbye_world at GOTPCREL(%rip), %rsi
+ mov $15, %rdx # length
+ syscall
+ mov $0, %rax
+ ret
Index: lld/MachO/Driver.cpp
===================================================================
--- lld/MachO/Driver.cpp
+++ lld/MachO/Driver.cpp
@@ -73,21 +73,18 @@
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 @@
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: {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81124.268334.patch
Type: text/x-patch
Size: 3551 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200603/ffde0b07/attachment-0001.bin>
More information about the llvm-commits
mailing list