aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-11 19:18:55 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-24 12:34:39 +0100
commiteca9bc4c33112155f855a71d0df015f995a96b29 (patch)
treeb44ae6188fe9702b4e6d0ca8e36cfccedf1fc03f /src
parentb28ff75f5d47ead9e8b416b41149147d796ff8db (diff)
downloadzig-eca9bc4c33112155f855a71d0df015f995a96b29.tar.gz
zig-eca9bc4c33112155f855a71d0df015f995a96b29.zip
macho: dead strip dylibs
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO.zig28
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;