aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-08-26 18:30:30 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-08-29 11:39:35 +0200
commit664b983518f29eed3c60b503cf12bddbb19f3afc (patch)
treed22da276fb20a4c7acd89237712e04c1931a279d /src
parentb2773cd7120f7120410e1635aaeec026c7bbcdd1 (diff)
downloadzig-664b983518f29eed3c60b503cf12bddbb19f3afc.tar.gz
zig-664b983518f29eed3c60b503cf12bddbb19f3afc.zip
macho: unify writeSegmentHeaders func
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO.zig21
-rw-r--r--src/link/MachO/zld.zig29
2 files changed, 20 insertions, 30 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 467b75c69c..52346e7863 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -3035,11 +3035,28 @@ pub fn getGlobalSymbol(self: *MachO, name: []const u8, lib_name: ?[]const u8) !u
return self.addUndefined(sym_name, .add_stub);
}
-fn writeSegmentHeaders(self: *MachO, writer: anytype) !void {
+pub fn writeSegmentHeaders(self: anytype, writer: anytype) !void {
for (self.segments.items, 0..) |seg, i| {
const indexes = self.getSectionIndexes(@as(u8, @intCast(i)));
- try writer.writeStruct(seg);
+ var out_seg = seg;
+ out_seg.cmdsize = @sizeOf(macho.segment_command_64);
+ out_seg.nsects = 0;
+
+ // Update section headers count; any section with size of 0 is excluded
+ // since it doesn't have any data in the final binary file.
+ for (self.sections.items(.header)[indexes.start..indexes.end]) |header| {
+ if (header.size == 0) continue;
+ out_seg.cmdsize += @sizeOf(macho.section_64);
+ out_seg.nsects += 1;
+ }
+
+ if (out_seg.nsects == 0 and
+ (mem.eql(u8, out_seg.segName(), "__DATA_CONST") or
+ mem.eql(u8, out_seg.segName(), "__DATA"))) continue;
+
+ try writer.writeStruct(out_seg);
for (self.sections.items(.header)[indexes.start..indexes.end]) |header| {
+ if (header.size == 0) continue;
try writer.writeStruct(header);
}
}
diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig
index 5bfff40405..61a0898312 100644
--- a/src/link/MachO/zld.zig
+++ b/src/link/MachO/zld.zig
@@ -1152,33 +1152,6 @@ pub const Zld = struct {
segment.vmsize = mem.alignForward(u64, segment.vmsize, page_size);
}
- fn writeSegmentHeaders(self: *Zld, writer: anytype) !void {
- for (self.segments.items, 0..) |seg, i| {
- const indexes = self.getSectionIndexes(@as(u8, @intCast(i)));
- var out_seg = seg;
- out_seg.cmdsize = @sizeOf(macho.segment_command_64);
- out_seg.nsects = 0;
-
- // Update section headers count; any section with size of 0 is excluded
- // since it doesn't have any data in the final binary file.
- for (self.sections.items(.header)[indexes.start..indexes.end]) |header| {
- if (header.size == 0) continue;
- out_seg.cmdsize += @sizeOf(macho.section_64);
- out_seg.nsects += 1;
- }
-
- if (out_seg.nsects == 0 and
- (mem.eql(u8, out_seg.segName(), "__DATA_CONST") or
- mem.eql(u8, out_seg.segName(), "__DATA"))) continue;
-
- try writer.writeStruct(out_seg);
- for (self.sections.items(.header)[indexes.start..indexes.end]) |header| {
- if (header.size == 0) continue;
- try writer.writeStruct(header);
- }
- }
- }
-
fn writeLinkeditSegmentData(self: *Zld) !void {
try self.writeDyldInfoData();
try self.writeFunctionStarts();
@@ -3035,7 +3008,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
var lc_buffer = std.ArrayList(u8).init(arena);
const lc_writer = lc_buffer.writer();
- try zld.writeSegmentHeaders(lc_writer);
+ try MachO.writeSegmentHeaders(&zld, lc_writer);
try lc_writer.writeStruct(zld.dyld_info_cmd);
try lc_writer.writeStruct(zld.function_starts_cmd);
try lc_writer.writeStruct(zld.data_in_code_cmd);