@@ -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+
4261pub ( crate ) fn target_arch ( self ) -> Cow < ' static , str > {
4362Cow :: Borrowed ( match self {
4463Armv7k | Armv7s => "arm" ,
@@ -116,20 +135,29 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: TargetAbi) -> LinkArgs {
116135} ;
117136let 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+
123149add_link_args_iter (
124150& mut args,
125151LinkerFlavor :: 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) ;
128154if abi != TargetAbi :: MacCatalyst {
155+ // CC forwards the `-arch` to the linker, so we use the same value
156+ // here intentionally.
129157add_link_args (
130158& mut args,
131159LinkerFlavor :: Darwin ( Cc :: Yes , Lld :: No ) ,
132- & [ "-arch" , arch. target_name ( ) ] ,
160+ & [ "-arch" , arch. ld_arch ( ) ] ,
133161) ;
134162} else {
135163add_link_args_iter (
0 commit comments