authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-08 16:55:13+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 10:56:03+02:00
log65c27d51f691524f63e964ad04cb12e3a77c5a9b
tree2884e28092ab5f3b4003bec7bbc17e2d1a4c3d0f
parent421102ba724370d04f14016006141a51c0f3e296

zld: limit exports to just main entrypoint


1 files changed, 10 insertions(+), 14 deletions(-)

src/link/MachO/Zld.zig+10-14
...@@ -2406,26 +2406,22 @@ fn writeExportInfo(self: *Zld) !void {...@@ -2406,26 +2406,22 @@ fn writeExportInfo(self: *Zld) !void {
2406 defer trie.deinit();2406 defer trie.deinit();
24072407
2408 const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;2408 const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;
2409 for (self.symtab.items()) |entry| {
2410 switch (entry.value.tag) {
2411 .Weak, .Strong => {},
2412 else => continue,
2413 }
2414 const name = entry.key;
2415 const symbol = entry.value.inner;
24162409
2417 assert(symbol.n_value >= text_segment.inner.vmaddr);2410 // TODO export items for dylibs
2411 const sym = self.symtab.get("_main") orelse return error.MissingMainEntrypoint;
2412 assert(sym.inner.n_value >= text_segment.inner.vmaddr);
24182413
2419 try trie.put(.{2414 try trie.put(.{
2420 .name = name,2415 .name = "_main",
2421 .vmaddr_offset = symbol.n_value - text_segment.inner.vmaddr,2416 .vmaddr_offset = sym.inner.n_value - text_segment.inner.vmaddr,
2422 .export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR,2417 .export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR,
2423 });2418 });
2424 }
24252419
2426 try trie.finalize();2420 try trie.finalize();
2421
2427 var buffer = try self.allocator.alloc(u8, @intCast(usize, trie.size));2422 var buffer = try self.allocator.alloc(u8, @intCast(usize, trie.size));
2428 defer self.allocator.free(buffer);2423 defer self.allocator.free(buffer);
2424
2429 var stream = std.io.fixedBufferStream(buffer);2425 var stream = std.io.fixedBufferStream(buffer);
2430 const nwritten = try trie.write(stream.writer());2426 const nwritten = try trie.write(stream.writer());
2431 assert(nwritten == trie.size);2427 assert(nwritten == trie.size);