authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-11 18:54:59+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:39+01:00
log1b76779857cae1d8212f574a4a3059fad9419476
tree7e2108f1b18080f01b40d53fdf8fedb2edba20c6
parent6b617afe2a3904ad3d5c9e3542a30bd7f35ed54e

macho: convert tentative defs and create objc sections


1 files changed, 47 insertions(+), 0 deletions(-)

src/link/MachO.zig+47
......@@ -500,6 +500,9 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
500500 try self.resolveSymbols();
501501 try self.resolveSyntheticSymbols();
502502
503 try self.convertTentativeDefinitions();
504 try self.createObjcSections();
505
503506 state_log.debug("{}", .{self.dumpState()});
504507
505508 @panic("TODO");
......@@ -1263,6 +1266,50 @@ fn resolveSyntheticSymbols(self: *MachO) !void {
12631266 }
12641267}
12651268
1269fn convertTentativeDefinitions(self: *MachO) !void {
1270 for (self.objects.items) |index| {
1271 try self.getFile(index).?.object.convertTentativeDefinitions(self);
1272 }
1273}
1274
1275fn createObjcSections(self: *MachO) !void {
1276 const gpa = self.base.comp.gpa;
1277 var objc_msgsend_syms = std.AutoArrayHashMap(Symbol.Index, void).init(gpa);
1278 defer objc_msgsend_syms.deinit();
1279
1280 for (self.objects.items) |index| {
1281 const object = self.getFile(index).?.object;
1282
1283 for (object.symbols.items, 0..) |sym_index, i| {
1284 const nlist_idx = @as(Symbol.Index, @intCast(i));
1285 const nlist = object.symtab.items(.nlist)[nlist_idx];
1286 if (!nlist.ext()) continue;
1287 if (!nlist.undf()) continue;
1288
1289 const sym = self.getSymbol(sym_index);
1290 if (sym.getFile(self) != null) continue;
1291 if (mem.startsWith(u8, sym.getName(self), "_objc_msgSend$")) {
1292 _ = try objc_msgsend_syms.put(sym_index, {});
1293 }
1294 }
1295 }
1296
1297 for (objc_msgsend_syms.keys()) |sym_index| {
1298 const sym = self.getSymbol(sym_index);
1299 sym.value = 0;
1300 sym.atom = 0;
1301 sym.nlist_idx = 0;
1302 sym.file = self.internal_object.?;
1303 sym.flags = .{};
1304 sym.visibility = .hidden;
1305 const object = self.getInternalObject().?;
1306 const name = eatPrefix(sym.getName(self), "_objc_msgSend$").?;
1307 const selrefs_index = try object.addObjcMsgsendSections(name, self);
1308 try sym.addExtra(.{ .objc_selrefs = selrefs_index }, self);
1309 try object.symbols.append(gpa, sym_index);
1310 }
1311}
1312
12661313fn shrinkAtom(self: *MachO, atom_index: Atom.Index, new_block_size: u64) void {
12671314 _ = self;
12681315 _ = atom_index;