Apple: Improve comments for -arch linker argument

This commit is contained in:
Mads Marquart 2024-09-05 06:47:11 +02:00
parent d6c8169c18
commit 23cdb50e4f
2 changed files with 36 additions and 11 deletions

View File

@ -39,6 +39,25 @@ fn target_name(self) -> &'static str {
} }
} }
/// The architecture name to forward to the linker.
fn ld_arch(self) -> &'static str {
// Supported architecture names can be found in the source:
// https://github.com/apple-oss-distributions/ld64/blob/ld64-951.9/src/abstraction/MachOFileAbstraction.hpp#L578-L648
match self {
Armv7k => "armv7k",
Armv7s => "armv7s",
Arm64 => "arm64",
Arm64e => "arm64e",
Arm64_32 => "arm64_32",
// ld64 doesn't understand i686, so fall back to i386 instead
//
// Same story when linking with cc, since that ends up invoking ld64.
I386 | I686 => "i386",
X86_64 => "x86_64",
X86_64h => "x86_64h",
}
}
pub(crate) fn target_arch(self) -> Cow<'static, str> { pub(crate) fn target_arch(self) -> Cow<'static, str> {
Cow::Borrowed(match self { Cow::Borrowed(match self {
Armv7k | Armv7s => "arm", Armv7k | Armv7s => "arm",
@ -116,20 +135,29 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: TargetAbi) -> LinkArgs {
}; };
let sdk_version = min_version.clone(); let sdk_version = min_version.clone();
let mut args = TargetOptions::link_args( // From the man page for ld64 (`man ld`):
LinkerFlavor::Darwin(Cc::No, Lld::No), // > The linker accepts universal (multiple-architecture) input files,
&["-arch", arch.target_name(), "-platform_version"], // > but always creates a "thin" (single-architecture), standard Mach-O
); // > output file. The architecture for the output file is specified using
// > the -arch option.
//
// The linker has heuristics to determine the desired architecture, but to
// be safe, and to avoid a warning, we set the architecture explicitly.
let mut args =
TargetOptions::link_args(LinkerFlavor::Darwin(Cc::No, Lld::No), &["-arch", arch.ld_arch()]);
add_link_args_iter( add_link_args_iter(
&mut args, &mut args,
LinkerFlavor::Darwin(Cc::No, Lld::No), LinkerFlavor::Darwin(Cc::No, Lld::No),
[platform_name, min_version, sdk_version].into_iter(), ["-platform_version".into(), platform_name, min_version, sdk_version].into_iter(),
); );
if abi != TargetAbi::MacCatalyst { if abi != TargetAbi::MacCatalyst {
// CC forwards the `-arch` to the linker, so we use the same value
// here intentionally.
add_link_args( add_link_args(
&mut args, &mut args,
LinkerFlavor::Darwin(Cc::Yes, Lld::No), LinkerFlavor::Darwin(Cc::Yes, Lld::No),
&["-arch", arch.target_name()], &["-arch", arch.ld_arch()],
); );
} else { } else {
add_link_args_iter( add_link_args_iter(

View File

@ -2,8 +2,7 @@
use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, Target, TargetOptions}; use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, Target, TargetOptions};
pub(crate) fn target() -> Target { pub(crate) fn target() -> Target {
// ld64 only understands i386 and not i686 let arch = Arch::I686;
let arch = Arch::I386;
let mut base = opts("macos", arch, TargetAbi::Normal); let mut base = opts("macos", arch, TargetAbi::Normal);
base.max_atomic_width = Some(64); base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-m32"]); base.add_pre_link_args(LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-m32"]);
@ -13,9 +12,7 @@ pub(crate) fn target() -> Target {
// Clang automatically chooses a more specific target based on // Clang automatically chooses a more specific target based on
// MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work // MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work
// correctly, we do too. // correctly, we do too.
// llvm_target: macos_llvm_target(arch).into(),
// While ld64 doesn't understand i686, LLVM does.
llvm_target: macos_llvm_target(Arch::I686).into(),
metadata: crate::spec::TargetMetadata { metadata: crate::spec::TargetMetadata {
description: Some("32-bit macOS (10.12+, Sierra+)".into()), description: Some("32-bit macOS (10.12+, Sierra+)".into()),
tier: Some(3), tier: Some(3),