diff options
| author | Brian M <bmisiak@me.com> | 2023-05-09 00:14:14 -0700 |
|---|---|---|
| committer | Brian M <bmisiak@me.com> | 2023-05-25 00:02:13 -0700 |
| commit | d816b8b26469db31cef8214a07756c3aa5009d79 (patch) | |
| tree | e234b75c167c84b35e2b7a10b0b72fc9097cd338 | |
| parent | 7664dfe4331265d0b2b1ffb89c92d443886bec0b (diff) | |
| download | rust-d816b8b26469db31cef8214a07756c3aa5009d79.tar.gz rust-d816b8b26469db31cef8214a07756c3aa5009d79.zip | |
Fix Mac Catalyst linking by adding build version
Issue #106021 Apple LD requires build versions in object files for Catalyst
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/back/metadata.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/metadata.rs b/compiler/rustc_codegen_ssa/src/back/metadata.rs index 8bf84772f08..ad27b854d59 100644 --- a/compiler/rustc_codegen_ssa/src/back/metadata.rs +++ b/compiler/rustc_codegen_ssa/src/back/metadata.rs @@ -188,6 +188,11 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static }; let mut file = write::Object::new(binary_format, architecture, endianness); + if sess.target.is_like_osx { + if let Some(build_version) = macho_object_build_version_for_target(&sess.target) { + file.set_macho_build_version(build_version) + } + } let e_flags = match architecture { Architecture::Mips => { let arch = match sess.target.options.cpu.as_ref() { @@ -258,6 +263,33 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static Some(file) } +/// Apple's LD, when linking for Mac Catalyst, requires object files to +/// contain information about what they were built for (LC_BUILD_VERSION): +/// the platform (macOS/watchOS etc), minimum OS version, and SDK version. +/// This returns a `MachOBuildVersion` if necessary for the target. +fn macho_object_build_version_for_target( + target: &Target, +) -> Option<object::write::MachOBuildVersion> { + if !target.llvm_target.ends_with("-macabi") { + return None; + } + /// The `object` crate demands "X.Y.Z encoded in nibbles as xxxx.yy.zz" + /// e.g. minOS 14.0 = 0x000E0000, or SDK 16.2 = 0x00100200 + fn pack_version((major, minor): (u32, u32)) -> u32 { + (major << 16) | (minor << 8) + } + + let platform = object::macho::PLATFORM_MACCATALYST; + let min_os = (14, 0); + let sdk = (16, 2); + + let mut build_version = object::write::MachOBuildVersion::default(); + build_version.platform = platform; + build_version.minos = pack_version(min_os); + build_version.sdk = pack_version(sdk); + Some(build_version) +} + pub enum MetadataPosition { First, Last, |
