macho: convert tentative defs and create objc sections

This commit is contained in:
Jakub Konka 2024-01-11 18:54:59 +01:00
parent 6b617afe2a
commit 1b76779857

View File

@ -500,6 +500,9 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
try self.resolveSymbols();
try self.resolveSyntheticSymbols();
try self.convertTentativeDefinitions();
try self.createObjcSections();
state_log.debug("{}", .{self.dumpState()});
@panic("TODO");
@ -1263,6 +1266,50 @@ fn resolveSyntheticSymbols(self: *MachO) !void {
}
}
fn convertTentativeDefinitions(self: *MachO) !void {
for (self.objects.items) |index| {
try self.getFile(index).?.object.convertTentativeDefinitions(self);
}
}
fn createObjcSections(self: *MachO) !void {
const gpa = self.base.comp.gpa;
var objc_msgsend_syms = std.AutoArrayHashMap(Symbol.Index, void).init(gpa);
defer objc_msgsend_syms.deinit();
for (self.objects.items) |index| {
const object = self.getFile(index).?.object;
for (object.symbols.items, 0..) |sym_index, i| {
const nlist_idx = @as(Symbol.Index, @intCast(i));
const nlist = object.symtab.items(.nlist)[nlist_idx];
if (!nlist.ext()) continue;
if (!nlist.undf()) continue;
const sym = self.getSymbol(sym_index);
if (sym.getFile(self) != null) continue;
if (mem.startsWith(u8, sym.getName(self), "_objc_msgSend$")) {
_ = try objc_msgsend_syms.put(sym_index, {});
}
}
}
for (objc_msgsend_syms.keys()) |sym_index| {
const sym = self.getSymbol(sym_index);
sym.value = 0;
sym.atom = 0;
sym.nlist_idx = 0;
sym.file = self.internal_object.?;
sym.flags = .{};
sym.visibility = .hidden;
const object = self.getInternalObject().?;
const name = eatPrefix(sym.getName(self), "_objc_msgSend$").?;
const selrefs_index = try object.addObjcMsgsendSections(name, self);
try sym.addExtra(.{ .objc_selrefs = selrefs_index }, self);
try object.symbols.append(gpa, sym_index);
}
}
fn shrinkAtom(self: *MachO, atom_index: Atom.Index, new_block_size: u64) void {
_ = self;
_ = atom_index;