aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-09-03 08:18:29 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-09-04 09:07:49 +0200
commitbff54536ff2cab302924dc77e298d6dbb4171209 (patch)
tree99daa61165e26a4b325d2b621ae580f8d980a4a4 /src
parent5cc1831ca423a777eeea6b147cedcd5165d1c056 (diff)
downloadzig-bff54536ff2cab302924dc77e298d6dbb4171209.tar.gz
zig-bff54536ff2cab302924dc77e298d6dbb4171209.zip
macho: check if we should emit LC_VERSION_MIN_ if target low enough
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO.zig2
-rw-r--r--src/link/MachO/load_commands.zig26
2 files changed, 20 insertions, 8 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 0265ed5c5f..ea5d5011f6 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -564,7 +564,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No
null;
if (platform.isBuildVersionCompatible()) {
try load_commands.writeBuildVersionLC(platform, sdk_version, lc_writer);
- } else {
+ } else if (platform.isVersionMinCompatible()) {
try load_commands.writeVersionMinLC(platform, sdk_version, lc_writer);
}
}
diff --git a/src/link/MachO/load_commands.zig b/src/link/MachO/load_commands.zig
index fa33b88e36..cd1e015757 100644
--- a/src/link/MachO/load_commands.zig
+++ b/src/link/MachO/load_commands.zig
@@ -76,13 +76,16 @@ fn calcLCsSize(gpa: Allocator, options: *const link.Options, ctx: CalcLCsSizeCtx
}
// LC_SOURCE_VERSION
sizeofcmds += @sizeOf(macho.source_version_command);
- // LC_BUILD_VERSION or LC_VERSION_MIN_
- if (Platform.fromTarget(options.target).isBuildVersionCompatible()) {
- // LC_BUILD_VERSION
- sizeofcmds += @sizeOf(macho.build_version_command) + @sizeOf(macho.build_tool_version);
- } else {
- // LC_VERSION_MIN_
- sizeofcmds += @sizeOf(macho.version_min_command);
+ // LC_BUILD_VERSION or LC_VERSION_MIN_ or nothing
+ {
+ const platform = Platform.fromTarget(options.target);
+ if (platform.isBuildVersionCompatible()) {
+ // LC_BUILD_VERSION
+ sizeofcmds += @sizeOf(macho.build_version_command) + @sizeOf(macho.build_tool_version);
+ } else if (platform.isVersionMinCompatible()) {
+ // LC_VERSION_MIN_
+ sizeofcmds += @sizeOf(macho.version_min_command);
+ }
}
// LC_UUID
sizeofcmds += @sizeOf(macho.uuid_command);
@@ -384,6 +387,15 @@ pub const Platform = struct {
return false;
}
+ pub fn isVersionMinCompatible(plat: Platform) bool {
+ inline for (supported_platforms) |sup_plat| {
+ if (sup_plat[0] == plat.os_tag and sup_plat[1] == plat.abi) {
+ return sup_plat[3] <= plat.toAppleVersion();
+ }
+ }
+ return false;
+ }
+
pub fn fmtTarget(plat: Platform, cpu_arch: std.Target.Cpu.Arch) std.fmt.Formatter(formatTarget) {
return .{ .data = .{ .platform = plat, .cpu_arch = cpu_arch } };
}