diff --git a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift index e130803ff..b2ed42b41 100644 --- a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift @@ -119,6 +119,16 @@ extension GenericUnixToolchain { } } + if targetTriple.os == .openbsd && targetTriple.arch == .aarch64 { + let btcfiEnabled = targetInfo.target.openbsdBTCFIEnabled ?? false + if !btcfiEnabled { + commandLine.appendFlag("-Xlinker") + commandLine.appendFlag("-z") + commandLine.appendFlag("-Xlinker") + commandLine.appendFlag("nobtcfi") + } + } + let staticStdlib = parsedOptions.hasFlag(positive: .staticStdlib, negative: .noStaticStdlib, default: false) diff --git a/Sources/SwiftDriver/Jobs/PrintTargetInfoJob.swift b/Sources/SwiftDriver/Jobs/PrintTargetInfoJob.swift index d43e91659..f4bfb2d15 100644 --- a/Sources/SwiftDriver/Jobs/PrintTargetInfoJob.swift +++ b/Sources/SwiftDriver/Jobs/PrintTargetInfoJob.swift @@ -101,6 +101,8 @@ public struct FrontendTargetInfo: Codable { /// Whether the Swift libraries need to be referenced in their system /// location (/usr/lib/swift) via rpath. let librariesRequireRPath: Bool + + let openbsdBTCFIEnabled: Bool? } @_spi(Testing) public struct Paths: Codable { diff --git a/Sources/SwiftDriver/Toolchains/GenericUnixToolchain.swift b/Sources/SwiftDriver/Toolchains/GenericUnixToolchain.swift index 11efe7c3e..7bbbcc437 100644 --- a/Sources/SwiftDriver/Toolchains/GenericUnixToolchain.swift +++ b/Sources/SwiftDriver/Toolchains/GenericUnixToolchain.swift @@ -163,12 +163,14 @@ public final class GenericUnixToolchain: Toolchain { } if driver.targetTriple.os == .openbsd && driver.targetTriple.arch == .aarch64 { - commandLine.appendFlag(.Xcc) - commandLine.appendFlag("-Xclang=-msign-return-address=non-leaf") - commandLine.appendFlag(.Xcc) - commandLine.appendFlag("-Xclang=-msign-return-address-key=a_key") - commandLine.appendFlag(.Xcc) - commandLine.appendFlag("-Xclang=-mbranch-target-enforce") + if frontendTargetInfo.target.openbsdBTCFIEnabled ?? false { + commandLine.appendFlag(.Xcc) + commandLine.appendFlag("-Xclang=-msign-return-address=non-leaf") + commandLine.appendFlag(.Xcc) + commandLine.appendFlag("-Xclang=-msign-return-address-key=a_key") + commandLine.appendFlag(.Xcc) + commandLine.appendFlag("-Xclang=-mbranch-target-enforce") + } } } }