@@ -116,21 +116,40 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: TargetAbi) -> LinkArgs {
116
116
} ;
117
117
let sdk_version = min_version. clone ( ) ;
118
118
119
- let mut args = TargetOptions :: link_args (
120
- LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) ,
121
- & [ "-arch" , arch. target_name ( ) , "-platform_version" ] ,
122
- ) ;
119
+ let mut args = LinkArgs :: new ( ) ;
120
+ // From the man page for ld64 (`man ld`):
121
+ // > The linker accepts universal (multiple-architecture) input files,
122
+ // > but always creates a "thin" (single-architecture), standard Mach-O
123
+ // > output file. The architecture for the output file is specified using
124
+ // > the -arch option.
125
+ //
126
+ // The linker has heuristics to determine the desired architecture, but to
127
+ // be safe, and to avoid a warning, we set the architecture explicitly.
128
+ //
129
+ // Supported architecture names can be found in the source:
130
+ // https://github.com/apple-oss-distributions/ld64/blob/ld64-951.9/src/abstraction/MachOFileAbstraction.hpp#L578-L648
131
+ let ld_arch = match arch {
132
+ Armv7k => "armv7k" ,
133
+ Armv7s => "armv7s" ,
134
+ Arm64 => "arm64" ,
135
+ Arm64e => "arm64e" ,
136
+ Arm64_32 => "arm64_32" ,
137
+ // ld64 doesn't understand i686, so fall back to i386 instead
138
+ //
139
+ // Same story when linking with cc, since that ends up invoking ld64.
140
+ I386 | I686 => "i386" ,
141
+ X86_64 => "x86_64" ,
142
+ X86_64h => "x86_64h" ,
143
+ } ;
144
+ add_link_args ( & mut args, LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) , & [ "-arch" , ld_arch] ) ;
145
+
123
146
add_link_args_iter (
124
147
& mut args,
125
148
LinkerFlavor :: Darwin ( Cc :: No , Lld :: No ) ,
126
- [ platform_name, min_version, sdk_version] . into_iter ( ) ,
149
+ [ "-platform_version" . into ( ) , platform_name, min_version, sdk_version] . into_iter ( ) ,
127
150
) ;
128
151
if abi != TargetAbi :: MacCatalyst {
129
- add_link_args (
130
- & mut args,
131
- LinkerFlavor :: Darwin ( Cc :: Yes , Lld :: No ) ,
132
- & [ "-arch" , arch. target_name ( ) ] ,
133
- ) ;
152
+ add_link_args ( & mut args, LinkerFlavor :: Darwin ( Cc :: Yes , Lld :: No ) , & [ "-arch" , ld_arch] ) ;
134
153
} else {
135
154
add_link_args_iter (
136
155
& mut args,
0 commit comments