diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-08-22 20:52:52 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-22 20:52:52 +0200 |
| commit | c6da5b08e0177d0b9053cd7dd6be422ee047d671 (patch) | |
| tree | ce8165d46e1860d5bfdf50cbda0dec5f804de27c | |
| parent | 3b1e7b1fc9853497140f7f5371882234f0295893 (diff) | |
| parent | 13e2f807a19398e735ca3addab19366cda133a31 (diff) | |
| download | rust-c6da5b08e0177d0b9053cd7dd6be422ee047d671.tar.gz rust-c6da5b08e0177d0b9053cd7dd6be422ee047d671.zip | |
Rollup merge of #88077 - kit-981:feature/fix-minimum-os-version-in-header, r=petrochenkov
Generate an iOS LLVM target with a specific version This commit adds the `LC_VERSION_MIN_IPHONEOS` load command to the Mach-O header generated for `aarch64-apple-ios` binaries. The operating system will look for this load command to determine the minimum supported operating system version and will not allow the binary to run if it's absent. This logic already exists for the simulator toolchain. I've been using `otool` from a [cctools](https://github.com/tpoechtrager/cctools-port) toolchain to parse the header and validate that this change adds the required load command. This change appears to be enough to build Rust binaries that can run on a jailbroken iPhone.
| -rw-r--r-- | compiler/rustc_target/src/spec/aarch64_apple_ios.rs | 9 | ||||
| -rw-r--r-- | compiler/rustc_target/src/spec/apple_base.rs | 5 |
2 files changed, 13 insertions, 1 deletions
diff --git a/compiler/rustc_target/src/spec/aarch64_apple_ios.rs b/compiler/rustc_target/src/spec/aarch64_apple_ios.rs index e5805d9e691..6468419fce7 100644 --- a/compiler/rustc_target/src/spec/aarch64_apple_ios.rs +++ b/compiler/rustc_target/src/spec/aarch64_apple_ios.rs @@ -2,8 +2,15 @@ use super::apple_sdk_base::{opts, Arch}; use crate::spec::{FramePointer, Target, TargetOptions}; pub fn target() -> Target { + // Clang automatically chooses a more specific target based on + // IPHONEOS_DEPLOYMENT_TARGET. + // This is required for the target to pick the right + // MACH-O commands, so we do too. + let arch = "arm64"; + let llvm_target = super::apple_base::ios_llvm_target(arch); + Target { - llvm_target: "arm64-apple-ios".to_string(), + llvm_target, pointer_width: 64, data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".to_string(), arch: "aarch64".to_string(), diff --git a/compiler/rustc_target/src/spec/apple_base.rs b/compiler/rustc_target/src/spec/apple_base.rs index 0c8a89210ff..cff0b3651e1 100644 --- a/compiler/rustc_target/src/spec/apple_base.rs +++ b/compiler/rustc_target/src/spec/apple_base.rs @@ -91,6 +91,11 @@ fn ios_deployment_target() -> (u32, u32) { deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((7, 0)) } +pub fn ios_llvm_target(arch: &str) -> String { + let (major, minor) = ios_deployment_target(); + format!("{}-apple-ios{}.{}.0", arch, major, minor) +} + pub fn ios_sim_llvm_target(arch: &str) -> String { let (major, minor) = ios_deployment_target(); format!("{}-apple-ios{}.{}.0-simulator", arch, major, minor) |
