Do not specify an SDK version in object files
This is unnecessary, since it ends up being overwritten when linking anyhow, and it feels wrong to embed some arbitrary SDK version in here.
This commit is contained in:
parent
8964c48726
commit
6b06ceb2fd
@ -402,13 +402,17 @@ fn pack_version((major, minor, patch): (u16, u8, u8)) -> u32 {
|
|||||||
let platform =
|
let platform =
|
||||||
rustc_target::spec::current_apple_platform(target).expect("unknown Apple target OS");
|
rustc_target::spec::current_apple_platform(target).expect("unknown Apple target OS");
|
||||||
let min_os = rustc_target::spec::current_apple_deployment_target(target);
|
let min_os = rustc_target::spec::current_apple_deployment_target(target);
|
||||||
let (sdk_major, sdk_minor) =
|
|
||||||
rustc_target::spec::current_apple_sdk_version(platform).expect("unknown Apple target OS");
|
|
||||||
|
|
||||||
let mut build_version = object::write::MachOBuildVersion::default();
|
let mut build_version = object::write::MachOBuildVersion::default();
|
||||||
build_version.platform = platform;
|
build_version.platform = platform;
|
||||||
build_version.minos = pack_version(min_os);
|
build_version.minos = pack_version(min_os);
|
||||||
build_version.sdk = pack_version((sdk_major, sdk_minor, 0));
|
// The version here does not _really_ matter, since it is only used at runtime, and we specify
|
||||||
|
// it when linking the final binary, so we will omit the version. This is also what LLVM does,
|
||||||
|
// and the tooling also allows this (and shows the SDK version as `n/a`). Finally, it is the
|
||||||
|
// semantically correct choice, as the SDK has not influenced the binary generated by rustc at
|
||||||
|
// this point in time.
|
||||||
|
build_version.sdk = 0;
|
||||||
|
|
||||||
build_version
|
build_version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,23 +158,6 @@ pub(crate) fn base(
|
|||||||
(opts, llvm_target(os, arch, abi), arch.target_arch())
|
(opts, llvm_target(os, arch, abi), arch.target_arch())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sdk_version(platform: u32) -> Option<(u16, u8)> {
|
|
||||||
// NOTE: These values are from an arbitrary point in time but shouldn't make it into the final
|
|
||||||
// binary since the final link command will have the current SDK version passed to it.
|
|
||||||
match platform {
|
|
||||||
object::macho::PLATFORM_MACOS => Some((13, 1)),
|
|
||||||
object::macho::PLATFORM_IOS
|
|
||||||
| object::macho::PLATFORM_IOSSIMULATOR
|
|
||||||
| object::macho::PLATFORM_TVOS
|
|
||||||
| object::macho::PLATFORM_TVOSSIMULATOR
|
|
||||||
| object::macho::PLATFORM_MACCATALYST => Some((16, 2)),
|
|
||||||
object::macho::PLATFORM_WATCHOS | object::macho::PLATFORM_WATCHOSSIMULATOR => Some((9, 1)),
|
|
||||||
// FIXME: Upgrade to `object-rs` 0.33+ implementation with visionOS platform definition
|
|
||||||
11 | 12 => Some((1, 0)),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn platform(target: &Target) -> Option<u32> {
|
pub fn platform(target: &Target) -> Option<u32> {
|
||||||
Some(match (&*target.os, &*target.abi) {
|
Some(match (&*target.os, &*target.abi) {
|
||||||
("macos", _) => object::macho::PLATFORM_MACOS,
|
("macos", _) => object::macho::PLATFORM_MACOS,
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
mod base;
|
mod base;
|
||||||
pub use base::apple::{
|
pub use base::apple::{
|
||||||
deployment_target_for_target as current_apple_deployment_target,
|
deployment_target_for_target as current_apple_deployment_target,
|
||||||
platform as current_apple_platform, sdk_version as current_apple_sdk_version,
|
platform as current_apple_platform,
|
||||||
};
|
};
|
||||||
pub use base::avr_gnu::ef_avr_arch;
|
pub use base::avr_gnu::ef_avr_arch;
|
||||||
|
|
||||||
|
@ -50,6 +50,15 @@ fn main() {
|
|||||||
// Set to 0, which means not set or "n/a".
|
// Set to 0, which means not set or "n/a".
|
||||||
has_sdk_version("foo.o", "n/a");
|
has_sdk_version("foo.o", "n/a");
|
||||||
|
|
||||||
|
// Check the SDK version in the .rmeta file, as set in `create_object_file`.
|
||||||
|
//
|
||||||
|
// This is just to ensure that we don't set some odd version in `create_object_file`,
|
||||||
|
// if the rmeta file is packed in a different way in the future, this can safely be removed.
|
||||||
|
rustc().target(target()).crate_type("rlib").input("foo.rs").output("libfoo.rlib").run();
|
||||||
|
// Extra .rmeta file (which is encoded as an object file).
|
||||||
|
cmd("ar").arg("-x").arg("libfoo.rlib").arg("lib.rmeta").run();
|
||||||
|
has_sdk_version("lib.rmeta", "n/a");
|
||||||
|
|
||||||
// Test that version makes it to the linker.
|
// Test that version makes it to the linker.
|
||||||
for (crate_type, file_ext) in [("bin", ""), ("dylib", ".dylib")] {
|
for (crate_type, file_ext) in [("bin", ""), ("dylib", ".dylib")] {
|
||||||
// Non-simulator watchOS targets don't support dynamic linking,
|
// Non-simulator watchOS targets don't support dynamic linking,
|
||||||
|
Loading…
Reference in New Issue
Block a user