diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-11 19:18:55 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-24 12:34:39 +0100 |
| commit | eca9bc4c33112155f855a71d0df015f995a96b29 (patch) | |
| tree | b44ae6188fe9702b4e6d0ca8e36cfccedf1fc03f /src | |
| parent | b28ff75f5d47ead9e8b416b41149147d796ff8db (diff) | |
| download | zig-eca9bc4c33112155f855a71d0df015f995a96b29.tar.gz zig-eca9bc4c33112155f855a71d0df015f995a96b29.zip | |
macho: dead strip dylibs
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 8783098e6b..3d51d71d34 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -506,6 +506,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node } self.markImportsAndExports(); + self.deadStripDylibs(); state_log.debug("{}", .{self.dumpState()}); @@ -1385,6 +1386,33 @@ fn markImportsAndExports(self: *MachO) void { } } +fn deadStripDylibs(self: *MachO) void { + for (&[_]?Symbol.Index{ + self.entry_index, + self.dyld_stub_binder_index, + self.objc_msg_send_index, + }) |index| { + if (index) |idx| { + const sym = self.getSymbol(idx); + if (sym.getFile(self)) |file| { + if (file == .dylib) file.dylib.referenced = true; + } + } + } + + for (self.dylibs.items) |index| { + self.getFile(index).?.dylib.markReferenced(self); + } + + var i: usize = 0; + while (i < self.dylibs.items.len) { + const index = self.dylibs.items[i]; + if (!self.getFile(index).?.dylib.isAlive(self)) { + _ = self.dylibs.orderedRemove(i); + } else i += 1; + } +} + fn shrinkAtom(self: *MachO, atom_index: Atom.Index, new_block_size: u64) void { _ = self; _ = atom_index; |
