Skip to content

Commit 7d4ba43

Browse files
authored
rdar://144577495 Install name mapping not specifying the correct platform number (#147)
The `$ld$previous` syntax used to map a renamed debug dylib for previews does not properly set the platform field. This plumbs them through as a new computed build macro and checks it in the previews settings test when `LD_CLIENT_NAME` is used.
1 parent fbad654 commit 7d4ba43

File tree

4 files changed

+17
-1
lines changed

4 files changed

+17
-1
lines changed

Sources/SWBCore/Settings/BuiltinMacros.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ public final class BuiltinMacros {
667667
public static let EXECUTABLE_DEBUG_DYLIB_PATH = BuiltinMacros.declareStringMacro("EXECUTABLE_DEBUG_DYLIB_PATH")
668668
public static let EXECUTABLE_DEBUG_DYLIB_INSTALL_NAME = BuiltinMacros.declareStringMacro("EXECUTABLE_DEBUG_DYLIB_INSTALL_NAME")
669669
public static let EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME = BuiltinMacros.declareStringMacro("EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME")
670+
public static let EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM = BuiltinMacros.declareStringMacro("EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM")
670671
public static let EXECUTABLE_BLANK_INJECTION_DYLIB_PATH = BuiltinMacros.declareStringMacro("EXECUTABLE_BLANK_INJECTION_DYLIB_PATH")
671672

672673
public static let EXECUTABLE_SUFFIX = BuiltinMacros.declareStringMacro("EXECUTABLE_SUFFIX")
@@ -1685,6 +1686,7 @@ public final class BuiltinMacros {
16851686
EXECUTABLE_DEBUG_DYLIB_PATH,
16861687
EXECUTABLE_DEBUG_DYLIB_INSTALL_NAME,
16871688
EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME,
1689+
EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM,
16881690
EXECUTABLE_BLANK_INJECTION_DYLIB_PATH,
16891691
EXECUTABLE_SUFFIX,
16901692
EXECUTABLE_VARIANT_SUFFIX,

Sources/SWBCore/Settings/Settings.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3326,6 +3326,18 @@ private class SettingsBuilder {
33263326
BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME,
33273327
table.namespace.parseString("@rpath/$(EXECUTABLE_NAME).debug.dylib")
33283328
)
3329+
3330+
let sdkVariant = sdk?.variant(for: scope.evaluate(BuiltinMacros.SDK_VARIANT))
3331+
let platform = sdk?.targetBuildVersionPlatform(sdkVariant: sdkVariant)
3332+
3333+
// Platform version identifiers used in `$ld$previous` mappings.
3334+
// Unknown values are specified with `0`.
3335+
let appleLDPreviousPlatform = platform?.rawValue ?? 0
3336+
3337+
table.push(
3338+
BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM,
3339+
table.namespace.parseLiteralString("\(appleLDPreviousPlatform)")
3340+
)
33293341
}
33303342
else {
33313343
table.push(

Sources/SWBCore/Specs/Tools/LinkerTools.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,10 +536,11 @@ public final class LdLinkerSpec : GenericLinkerSpec, SpecIdentifierType, @unchec
536536
// Aliasing a known symbol to this `$ld$previous` symbol is sufficient.
537537
let ldFlagsForAllowableClientOverride: [String]
538538
if let mappedInstallName = cbc.scope.evaluate(BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME).nilIfEmpty {
539+
let platform = cbc.scope.evaluate(BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM)
539540
ldFlagsForAllowableClientOverride = [
540541
"-Xlinker", "-alias",
541542
"-Xlinker", "___debug_main_executable_dylib_entry_point",
542-
"-Xlinker", "$ld$previous$\(mappedInstallName)$$1$1.0$9999.0$$",
543+
"-Xlinker", "$ld$previous$\(mappedInstallName)$$\(platform)$1.0$9999.0$$",
543544
]
544545
} else {
545546
ldFlagsForAllowableClientOverride = []

Tests/SWBCoreTests/SettingsTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,6 +2867,7 @@ import SWBMacro
28672867
#expect(settings.globalScope.evaluate(BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_INSTALL_NAME) == "@rpath/MyOtherClient.debug.dylib")
28682868
// But should be mapped to the original install name
28692869
#expect(settings.globalScope.evaluate(BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_INSTALL_NAME) == "@rpath/Target1.debug.dylib")
2870+
#expect(settings.globalScope.evaluate(BuiltinMacros.EXECUTABLE_DEBUG_DYLIB_MAPPED_PLATFORM) == "2")
28702871
#expect(settings.globalScope.evaluate(BuiltinMacros.EXECUTABLE_BLANK_INJECTION_DYLIB_PATH).suffix(15) == "__preview.dylib")
28712872
}
28722873

0 commit comments

Comments
 (0)