Skip to content

Commit aad8c2c

Browse files
Merge pull request #650 from artemcm/CherryPickXlinkerFlagsNonDarwin
[5.5] Pass down `-Xlinker` flags to the underlying clang linker call using `-Xlinker` prefix
2 parents 892db06 + 4a18bbd commit aad8c2c

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,15 @@ extension GenericUnixToolchain {
268268
try commandLine.append(
269269
contentsOf: parsedOptions.arguments(in: .linkerOption)
270270
)
271-
try commandLine.appendAllArguments(.Xlinker, from: &parsedOptions)
271+
// Because we invoke `clang` as the linker executable, we must still
272+
// use `-Xlinker` for linker-specific arguments.
273+
for linkerOpt in parsedOptions.arguments(for: .Xlinker) {
274+
commandLine.appendFlag(.Xlinker)
275+
commandLine.appendFlag(linkerOpt.argument.asSingle)
276+
}
272277
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
273278

274-
// This should be the last option, for convenience in checking output.
279+
// This should be the last option, for convenience in checking output.
275280
commandLine.appendFlag(.o)
276281
commandLine.appendPath(outputFile)
277282
return clangPath

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,21 @@ final class SwiftDriverTests: XCTestCase {
10851085
XCTAssertFalse(cmd.contains(.flag("-shared")))
10861086
}
10871087

1088+
#if os(Linux)
1089+
do {
1090+
// Xlinker flags
1091+
// Ensure that Xlinker flags are passed as such to the clang linker invocation.
1092+
var driver = try Driver(args: commonArgs + ["-emit-library", "-L", "/tmp", "-Xlinker", "-w",
1093+
"-Xlinker", "-rpath=$ORIGIN",
1094+
"-target", "x86_64-unknown-linux"], env: env)
1095+
let plannedJobs = try driver.planBuild()
1096+
XCTAssertEqual(plannedJobs.count, 4)
1097+
let linkJob = plannedJobs[3]
1098+
let cmd = linkJob.commandLine
1099+
XCTAssertTrue(cmd.contains(subsequence: [.flag("-Xlinker"), .flag("-rpath=$ORIGIN")]))
1100+
}
1101+
#endif
1102+
10881103
do {
10891104
// Object file inputs
10901105
var driver = try Driver(args: commonArgs + ["baz.o", "-emit-library", "-target", "x86_64-apple-macosx10.15"], env: env)

0 commit comments

Comments
 (0)