zld: limit exports to just main entrypoint

This commit is contained in:
Jakub Konka
2021-04-08 16:55:13 +02:00
parent 421102ba72
commit 65c27d51f6

View File

@@ -2406,26 +2406,22 @@ fn writeExportInfo(self: *Zld) !void {
defer trie.deinit();
const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;
for (self.symtab.items()) |entry| {
switch (entry.value.tag) {
.Weak, .Strong => {},
else => continue,
}
const name = entry.key;
const symbol = entry.value.inner;
assert(symbol.n_value >= text_segment.inner.vmaddr);
// TODO export items for dylibs
const sym = self.symtab.get("_main") orelse return error.MissingMainEntrypoint;
assert(sym.inner.n_value >= text_segment.inner.vmaddr);
try trie.put(.{
.name = name,
.vmaddr_offset = symbol.n_value - text_segment.inner.vmaddr,
.export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR,
});
}
try trie.put(.{
.name = "_main",
.vmaddr_offset = sym.inner.n_value - text_segment.inner.vmaddr,
.export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR,
});
try trie.finalize();
var buffer = try self.allocator.alloc(u8, @intCast(usize, trie.size));
defer self.allocator.free(buffer);
var stream = std.io.fixedBufferStream(buffer);
const nwritten = try trie.write(stream.writer());
assert(nwritten == trie.size);