diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp index 0cee1a84d0b55..b40a812f30bd3 100644 --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -1725,7 +1725,10 @@ DylibFile::DylibFile(MemoryBufferRef mb, DylibFile *umbrella, } // Initialize symbols. - exportingFile = isImplicitlyLinked(installName) ? this : this->umbrella; + bool canBeImplicitlyLinked = findCommand(hdr, LC_SUB_CLIENT) == nullptr; + exportingFile = (canBeImplicitlyLinked && isImplicitlyLinked(installName)) + ? this + : this->umbrella; const auto *dyldInfo = findCommand(hdr, LC_DYLD_INFO_ONLY); const auto *exportsTrie = @@ -1884,7 +1887,10 @@ DylibFile::DylibFile(const InterfaceFile &interface, DylibFile *umbrella, checkAppExtensionSafety(interface.isApplicationExtensionSafe()); - exportingFile = isImplicitlyLinked(installName) ? this : umbrella; + bool canBeImplicitlyLinked = interface.allowableClients().size() == 0; + exportingFile = (canBeImplicitlyLinked && isImplicitlyLinked(installName)) + ? this + : umbrella; auto addSymbol = [&](const llvm::MachO::Symbol &symbol, const Twine &name) -> void { StringRef savedName = saver().save(name); diff --git a/lld/test/MachO/implicit-and-allowable-clients.test b/lld/test/MachO/implicit-and-allowable-clients.test new file mode 100644 index 0000000000000..e3f93aa7df0e8 --- /dev/null +++ b/lld/test/MachO/implicit-and-allowable-clients.test @@ -0,0 +1,49 @@ +# REQUIRES: arm +# RUN: rm -rf %t; split-file %s %t +# RUN: ln -s Versions/A/FrameworkPublic.tbd %t/System/Library/Frameworks/FrameworkPublic.framework/ +# RUN: ln -s Versions/A/FrameworkPrivate.tbd %t/System/Library/Frameworks/FrameworkPrivate.framework/ +# RUN: llvm-mc -filetype obj -triple arm64-apple-macos11.0 %t/test.s -o %t/test.o +# RUN: %lld -arch arm64 -platform_version macos 11.0 11.0 -o %t/test -syslibroot %t -framework FrameworkPublic %t/test.o + +# RUN: llvm-objdump --bind --no-show-raw-insn -d %t/test | FileCheck %s +# CHECK: Bind table: +# CHECK-DAG: __DATA __data {{.*}} pointer 0 FrameworkPublic _funcPublic +# CHECK-DAG: __DATA __data {{.*}} pointer 0 FrameworkPublic _funcPrivate + +#--- System/Library/Frameworks/FrameworkPublic.framework/Versions/A/FrameworkPublic.tbd +--- !tapi-tbd +tbd-version: 4 +targets: [ arm64-macos ] +install-name: '/System/Library/Frameworks/FrameworkPublic.framework/Versions/A/FrameworkPublic' +current-version: 1.0.0 +reexported-libraries: + - targets: [ arm64-macos ] + libraries: [ '/System/Library/Frameworks/FrameworkPrivate.framework/Versions/A/FrameworkPrivate' ] +exports: + - targets: [ arm64-macos ] + symbols: [ '_funcPublic' ] +... +#--- System/Library/Frameworks/FrameworkPrivate.framework/Versions/A/FrameworkPrivate.tbd +--- !tapi-tbd +tbd-version: 4 +targets: [ arm64-macos ] +install-name: '/System/Library/Frameworks/FrameworkPrivate.framework/Versions/A/FrameworkPrivate' +current-version: 1.0.0 +allowable-clients: + - targets: [ arm64-macos ] + clients: [ FrameworkPublic ] +exports: + - targets: [ arm64-macos ] + symbols: [ '_funcPrivate' ] +... +#--- test.s +.text +.globl _main + +_main: + ret + +.data + .quad _funcPublic + .quad _funcPrivate +