Index: lld/MachO/InputFiles.h =================================================================== --- lld/MachO/InputFiles.h +++ lld/MachO/InputFiles.h @@ -177,7 +177,8 @@ private: bool handleLDSymbol(StringRef originalName); void handleLDPreviousSymbol(StringRef name, StringRef originalName); - void handleLDInstallNameSymbol(StringRef name, StringRef originalName); + void handleLDActionSymbol(StringRef action, StringRef name, + StringRef originalName); }; // .a file Index: lld/MachO/InputFiles.cpp =================================================================== --- lld/MachO/InputFiles.cpp +++ lld/MachO/InputFiles.cpp @@ -1010,8 +1010,8 @@ std::tie(action, name) = originalName.drop_front(strlen("$ld$")).split('$'); if (action == "previous") handleLDPreviousSymbol(name, originalName); - else if (action == "install_name") - handleLDInstallNameSymbol(name, originalName); + else + handleLDActionSymbol(action, name, originalName); return true; } @@ -1068,16 +1068,20 @@ } } -void DylibFile::handleLDInstallNameSymbol(StringRef name, +void DylibFile::handleLDActionSymbol(StringRef action, StringRef name, StringRef originalName) { - // originalName: $ld$ install_name $ os $ install_name - StringRef condition, installName; - std::tie(condition, installName) = name.split('$'); + // originalName: $ld$ $ os $ symbol + StringRef condition, symbol; + std::tie(condition, symbol) = name.split('$'); VersionTuple version; if (!condition.consume_front("os") || version.tryParse(condition)) warn("failed to parse os version, symbol '" + originalName + "' ignored"); - else if (version == config->platformInfo.minimum) - this->installName = saver.save(installName); + else if (version != config->platformInfo.minimum) + return; + + if (action == "install_name") + installName = saver.save(symbol); + // FIXME: Support actions "compatibility_version", "hide", "add", "weak". } ArchiveFile::ArchiveFile(std::unique_ptr &&f)