diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-09-03 08:18:29 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-09-04 09:07:49 +0200 |
| commit | bff54536ff2cab302924dc77e298d6dbb4171209 (patch) | |
| tree | 99daa61165e26a4b325d2b621ae580f8d980a4a4 /src | |
| parent | 5cc1831ca423a777eeea6b147cedcd5165d1c056 (diff) | |
| download | zig-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.zig | 2 | ||||
| -rw-r--r-- | src/link/MachO/load_commands.zig | 26 |
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 } }; } |
