[lld] ed2f0ad - [lld/mac] Search .tbd before binary for framework files too

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 14 12:27:01 PDT 2021


Author: Nico Weber
Date: 2021-09-14T15:26:45-04:00
New Revision: ed2f0ad307193165a64c9847c24d8c9f4219f42b

URL: https://github.com/llvm/llvm-project/commit/ed2f0ad307193165a64c9847c24d8c9f4219f42b
DIFF: https://github.com/llvm/llvm-project/commit/ed2f0ad307193165a64c9847c24d8c9f4219f42b.diff

LOG: [lld/mac] Search .tbd before binary for framework files too

This matters for example for the iPhoneSimulator14.0.sdk, which has
a System/Library/Frameworks/UIKit.framework/UIKit that has
LC_BUILD_VERSION with minos of 14.0, so linking against that file
will produce warnings like:

   .../iPhoneSimulator14.0.sdk/System/Library/Frameworks/UIKit.framework/UIKit
   has version 14.0.0, which is newer than target minimum of 12.0.0

when targeting x86_64-apple-ios12.0-simulator. That doens't happen when
linking against UIKit.tbd instead, obviously.

Linking with RC_TRACE_DYLIB_SEARCHING=1 shows that ld64 also searches
the tbd file first, and we already get that right for non-framework
dylibs.

Fixes crbug.com/1249456.

Differential Revision: https://reviews.llvm.org/D109768

Added: 
    

Modified: 
    lld/MachO/DriverUtils.cpp
    lld/test/MachO/link-search-order.s

Removed: 
    


################################################################################
diff  --git a/lld/MachO/DriverUtils.cpp b/lld/MachO/DriverUtils.cpp
index 0cdea438b44ad..cbbb242aed755 100644
--- a/lld/MachO/DriverUtils.cpp
+++ b/lld/MachO/DriverUtils.cpp
@@ -186,17 +186,17 @@ static void searchedDylib(const Twine &path, bool found) {
 Optional<std::string> macho::resolveDylibPath(StringRef dylibPath) {
   // TODO: if a tbd and dylib are both present, we should check to make sure
   // they are consistent.
-  bool dylibExists = fs::exists(dylibPath);
-  searchedDylib(dylibPath, dylibExists);
-  if (dylibExists)
-    return std::string(dylibPath);
-
   SmallString<261> tbdPath = dylibPath;
   path::replace_extension(tbdPath, ".tbd");
   bool tbdExists = fs::exists(tbdPath);
   searchedDylib(tbdPath, tbdExists);
   if (tbdExists)
     return std::string(tbdPath);
+
+  bool dylibExists = fs::exists(dylibPath);
+  searchedDylib(dylibPath, dylibExists);
+  if (dylibExists)
+    return std::string(dylibPath);
   return {};
 }
 

diff  --git a/lld/test/MachO/link-search-order.s b/lld/test/MachO/link-search-order.s
index 6e2a4d129324d..9996b9ae66ae4 100644
--- a/lld/test/MachO/link-search-order.s
+++ b/lld/test/MachO/link-search-order.s
@@ -48,6 +48,10 @@
 # RUN:     -L%tD       -L%t -lhello -lgoodbye -lSystem %t/test.o -search_dylibs_first
 # RUN: llvm-objdump --macho --dylibs-used %t/test | FileCheck --check-prefix=DYLIB %s
 
+################ Test that we try the tbd file before the binary for frameworks too.
+# RUN: not %lld -dylib -F %t -framework Foo -o %t --print-dylib-search \
+# RUN:     | FileCheck --check-prefix=FRAMEWORKSEARCH -DPATH=%t %s
+
 # DYLIB: @executable_path/libhello.dylib
 # DYLIB: @executable_path/libgoodbye.dylib
 # DYLIB: /usr/lib/libSystem.dylib
@@ -72,6 +76,9 @@
 # ARCHIVESEARCH:      searched [[PATH]]{{[/\\]}}libhello.dylib, found
 # ARCHIVESEARCH:      searched [[PATH]]A{{[/\\]}}libgoodbye.a, found
 
+# FRAMEWORKSEARCH:      searched [[PATH]]{{[/\\]}}Foo.framework{{[/\\]}}Foo.tbd, not found
+# FRAMEWORKSEARCH-NEXT: searched [[PATH]]{{[/\\]}}Foo.framework{{[/\\]}}Foo, not found
+
 .section __TEXT,__text
 .global _main
 


        


More information about the llvm-commits mailing list