mirror of
https://github.com/ziglang/zig.git
synced 2026-02-09 11:03:30 +00:00
Merge pull request #13459 from ziglang/issue-13457
macho: do not zero-out file if there are no nonzerofill sects
This commit is contained in:
commit
5ef33e7c7e
@ -4300,24 +4300,21 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
|
||||
// segment and the beginning of __LINKEDIT segment is zerofilled as the loader will
|
||||
// copy-paste this space into memory for quicker zerofill operation.
|
||||
if (zld.getSegmentByName("__DATA")) |data_seg_id| blk: {
|
||||
var physical_zerofill_start: u64 = 0;
|
||||
var physical_zerofill_start: ?u64 = null;
|
||||
const section_indexes = zld.getSectionIndexes(data_seg_id);
|
||||
for (zld.sections.items(.header)[section_indexes.start..section_indexes.end]) |header| {
|
||||
if (header.isZerofill() and header.size > 0) break;
|
||||
physical_zerofill_start = header.offset + header.size;
|
||||
} else break :blk;
|
||||
const start = physical_zerofill_start orelse break :blk;
|
||||
const linkedit = zld.getLinkeditSegmentPtr();
|
||||
const physical_zerofill_size = math.cast(usize, linkedit.fileoff - physical_zerofill_start) orelse
|
||||
return error.Overflow;
|
||||
if (physical_zerofill_size > 0) {
|
||||
log.debug("zeroing out zerofill area of length {x} at {x}", .{
|
||||
physical_zerofill_size,
|
||||
physical_zerofill_start,
|
||||
});
|
||||
var padding = try zld.gpa.alloc(u8, physical_zerofill_size);
|
||||
const size = math.cast(usize, linkedit.fileoff - start) orelse return error.Overflow;
|
||||
if (size > 0) {
|
||||
log.debug("zeroing out zerofill area of length {x} at {x}", .{ size, start });
|
||||
var padding = try zld.gpa.alloc(u8, size);
|
||||
defer zld.gpa.free(padding);
|
||||
mem.set(u8, padding, 0);
|
||||
try zld.file.pwriteAll(padding, physical_zerofill_start);
|
||||
try zld.file.pwriteAll(padding, start);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -79,6 +79,10 @@ fn addWasmCases(cases: *tests.StandaloneContext) void {
|
||||
}
|
||||
|
||||
fn addMachOCases(cases: *tests.StandaloneContext) void {
|
||||
cases.addBuildFile("test/link/macho/bugs/13457/build.zig", .{
|
||||
.build_modes = true,
|
||||
});
|
||||
|
||||
cases.addBuildFile("test/link/macho/dead_strip/build.zig", .{
|
||||
.build_modes = false,
|
||||
});
|
||||
|
||||
17
test/link/macho/bugs/13457/build.zig
Normal file
17
test/link/macho/bugs/13457/build.zig
Normal file
@ -0,0 +1,17 @@
|
||||
const std = @import("std");
|
||||
const Builder = std.build.Builder;
|
||||
const LibExeObjectStep = std.build.LibExeObjStep;
|
||||
|
||||
pub fn build(b: *Builder) void {
|
||||
const mode = b.standardReleaseOptions();
|
||||
const target: std.zig.CrossTarget = .{ .os_tag = .macos };
|
||||
|
||||
const test_step = b.step("test", "Test the program");
|
||||
|
||||
const exe = b.addExecutable("test", "main.zig");
|
||||
exe.setBuildMode(mode);
|
||||
exe.setTarget(target);
|
||||
|
||||
const run = exe.runEmulatable();
|
||||
test_step.dependOn(&run.step);
|
||||
}
|
||||
1
test/link/macho/bugs/13457/main.zig
Normal file
1
test/link/macho/bugs/13457/main.zig
Normal file
@ -0,0 +1 @@
|
||||
pub fn main() void {}
|
||||
Loading…
x
Reference in New Issue
Block a user