@@ -39,6 +39,25 @@ impl Arch {
3939 }
4040 }
4141
42+ /// The architecture name to forward to the linker.
43+ fn ld_arch ( self ) -> & ' static str {
44+ // Supported architecture names can be found in the source:
45+ // https://github.com/apple-oss-distributions/ld64/blob/ld64-951.9/src/abstraction/MachOFileAbstraction.hpp#L578-L648
46+ match self {
47+ Armv7k => "armv7k" ,
48+ Armv7s => "armv7s" ,
49+ Arm64 => "arm64" ,
50+ Arm64e => "arm64e" ,
51+ Arm64_32 => "arm64_32" ,
52+ // ld64 doesn't understand i686, so fall back to i386 instead
53+ //
54+ // Same story when linking with cc, since that ends up invoking ld64.
55+ I386 | I686 => "i386" ,
56+ X86_64 => "x86_64" ,
57+ X86_64h => "x86_64h" ,
58+ }
59+ }
60+
4261 pub ( crate ) fn target_arch ( self ) -> Cow < ' static , str > {
4362 Cow :: Borrowed ( match self {
4463 Armv7k | Armv7s => "arm" ,
@@ -116,20 +135,29 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: TargetAbi) -> LinkArgs {
116135 } ;
117136 let sdk_version = min_version. clone ( ) ;
118137
119- let mut args = TargetOptions :: link_args (
120- LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) ,
121- & [ "-arch" , arch. target_name ( ) , "-platform_version" ] ,
122- ) ;
138+ // From the man page for ld64 (`man ld`):
139+ // > The linker accepts universal (multiple-architecture) input files,
140+ // > but always creates a "thin" (single-architecture), standard Mach-O
141+ // > output file. The architecture for the output file is specified using
142+ // > the -arch option.
143+ //
144+ // The linker has heuristics to determine the desired architecture, but to
145+ // be safe, and to avoid a warning, we set the architecture explicitly.
146+ let mut args =
147+ TargetOptions :: link_args ( LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) , & [ "-arch" , arch. ld_arch ( ) ] ) ;
148+
123149 add_link_args_iter (
124150 & mut args,
125151 LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) ,
126- [ platform_name, min_version, sdk_version] . into_iter ( ) ,
152+ [ "-platform_version" . into ( ) , platform_name, min_version, sdk_version] . into_iter ( ) ,
127153 ) ;
128154 if abi != TargetAbi :: MacCatalyst {
155+ // CC forwards the `-arch` to the linker, so we use the same value
156+ // here intentionally.
129157 add_link_args (
130158 & mut args,
131159 LinkerFlavor :: Darwin ( Cc :: Yes , Lld :: No ) ,
132- & [ "-arch" , arch. target_name ( ) ] ,
160+ & [ "-arch" , arch. ld_arch ( ) ] ,
133161 ) ;
134162 } else {
135163 add_link_args_iter (
0 commit comments