diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-08-26 18:30:30 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-08-29 11:39:35 +0200 |
| commit | 664b983518f29eed3c60b503cf12bddbb19f3afc (patch) | |
| tree | d22da276fb20a4c7acd89237712e04c1931a279d /src | |
| parent | b2773cd7120f7120410e1635aaeec026c7bbcdd1 (diff) | |
| download | zig-664b983518f29eed3c60b503cf12bddbb19f3afc.tar.gz zig-664b983518f29eed3c60b503cf12bddbb19f3afc.zip | |
macho: unify writeSegmentHeaders func
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 21 | ||||
| -rw-r--r-- | src/link/MachO/zld.zig | 29 |
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); |
