diff --git a/lld/MachO/InputFiles.h b/lld/MachO/InputFiles.h --- a/lld/MachO/InputFiles.h +++ b/lld/MachO/InputFiles.h @@ -190,7 +190,10 @@ bool handleLDSymbol(StringRef originalName); void handleLDPreviousSymbol(StringRef name, StringRef originalName); void handleLDInstallNameSymbol(StringRef name, StringRef originalName); + void handleHideSymbol(StringRef name, StringRef originalName); void checkAppExtensionSafety(bool dylibIsAppExtensionSafe) const; + + llvm::DenseSet hiddenSymbols; }; // .a file diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -1154,6 +1154,8 @@ return; bool isWeakDef = flags & EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION; bool isTlv = flags & EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL; + if (hiddenSymbols.contains(cachedHashStringRef(savedName))) + return; symbols.push_back(symtab->addDylib(savedName, exportingFile, isWeakDef, isTlv)); }); @@ -1289,6 +1291,8 @@ handleLDPreviousSymbol(name, originalName); else if (action == "install_name") handleLDInstallNameSymbol(name, originalName); + else if (action == "hide") + handleHideSymbol(name, originalName); return true; } @@ -1357,6 +1361,28 @@ this->installName = saver.save(installName); } +void DylibFile::handleHideSymbol(StringRef name, StringRef originalName) { + StringRef symbolName; + bool shouldHide = true; + if (name.startswith("os")) { + // If it's hidden based on versions. + StringRef minVersion; + std::tie(minVersion, symbolName) = name.split('$'); + VersionTuple versionTup; + if (versionTup.tryParse(minVersion)) { + warn("Failed to parse hidden version, symbol `" + originalName + + "` ignored."); + return; + } + shouldHide = versionTup == config->platformInfo.minimum; + } else + symbolName = name; + + if (!shouldHide) + return; + hiddenSymbol.insert(CachedHashStringRef(symbolName)); +} + void DylibFile::checkAppExtensionSafety(bool dylibIsAppExtensionSafe) const { if (config->applicationExtension && !dylibIsAppExtensionSafe) warn("using '-application_extension' with unsafe dylib: " + toString(this));