| ... | @@ -1285,53 +1285,6 @@ fn markLive(self: *MachO) void { | ... | @@ -1285,53 +1285,6 @@ fn markLive(self: *MachO) void { |
| 1285 | if (self.getInternalObject()) |obj| obj.markLive(self); | 1285 | if (self.getInternalObject()) |obj| obj.markLive(self); |
| 1286 | } | 1286 | } |
| 1287 | | 1287 | |
| 1288 | fn resolveSyntheticSymbols(self: *MachO) !void { | | |
| 1289 | const internal = self.getInternalObject() orelse return; | | |
| 1290 | | | |
| 1291 | if (!self.base.isDynLib()) { | | |
| 1292 | self.mh_execute_header_index = try internal.addSymbol("__mh_execute_header", self); | | |
| 1293 | const sym = self.getSymbol(self.mh_execute_header_index.?); | | |
| 1294 | sym.flags.@"export" = true; | | |
| 1295 | sym.flags.dyn_ref = true; | | |
| 1296 | sym.visibility = .global; | | |
| 1297 | } else { | | |
| 1298 | self.mh_dylib_header_index = try internal.addSymbol("__mh_dylib_header", self); | | |
| 1299 | } | | |
| 1300 | | | |
| 1301 | self.dso_handle_index = try internal.addSymbol("___dso_handle", self); | | |
| 1302 | self.dyld_private_index = try internal.addSymbol("dyld_private", self); | | |
| 1303 | | | |
| 1304 | { | | |
| 1305 | const gpa = self.base.comp.gpa; | | |
| 1306 | var boundary_symbols = std.AutoHashMap(Symbol.Index, void).init(gpa); | | |
| 1307 | defer boundary_symbols.deinit(); | | |
| 1308 | | | |
| 1309 | for (self.objects.items) |index| { | | |
| 1310 | const object = self.getFile(index).?.object; | | |
| 1311 | for (object.symbols.items, 0..) |sym_index, i| { | | |
| 1312 | const nlist = object.symtab.items(.nlist)[i]; | | |
| 1313 | const name = self.getSymbol(sym_index).getName(self); | | |
| 1314 | if (!nlist.undf() or !nlist.ext()) continue; | | |
| 1315 | if (mem.startsWith(u8, name, "segment$start$") or | | |
| 1316 | mem.startsWith(u8, name, "segment$stop$") or | | |
| 1317 | mem.startsWith(u8, name, "section$start$") or | | |
| 1318 | mem.startsWith(u8, name, "section$stop$")) | | |
| 1319 | { | | |
| 1320 | _ = try boundary_symbols.put(sym_index, {}); | | |
| 1321 | } | | |
| 1322 | } | | |
| 1323 | } | | |
| 1324 | | | |
| 1325 | try self.boundary_symbols.ensureTotalCapacityPrecise(gpa, boundary_symbols.count()); | | |
| 1326 | | | |
| 1327 | var it = boundary_symbols.iterator(); | | |
| 1328 | while (it.next()) |entry| { | | |
| 1329 | _ = try internal.addSymbol(self.getSymbol(entry.key_ptr.*).getName(self), self); | | |
| 1330 | self.boundary_symbols.appendAssumeCapacity(entry.key_ptr.*); | | |
| 1331 | } | | |
| 1332 | } | | |
| 1333 | } | | |
| 1334 | | | |
| 1335 | fn convertTentativeDefsAndResolveSpecialSymbols(self: *MachO) !void { | 1288 | fn convertTentativeDefsAndResolveSpecialSymbols(self: *MachO) !void { |
| 1336 | for (self.objects.items) |index| { | 1289 | for (self.objects.items) |index| { |
| 1337 | try self.getFile(index).?.object.convertTentativeDefinitions(self); | 1290 | try self.getFile(index).?.object.convertTentativeDefinitions(self); |
| ... | @@ -1342,40 +1295,6 @@ fn convertTentativeDefsAndResolveSpecialSymbols(self: *MachO) !void { | ... | @@ -1342,40 +1295,6 @@ fn convertTentativeDefsAndResolveSpecialSymbols(self: *MachO) !void { |
| 1342 | } | 1295 | } |
| 1343 | } | 1296 | } |
| 1344 | | 1297 | |
| 1345 | fn createObjcSections(self: *MachO) !void { | | |
| 1346 | const gpa = self.base.comp.gpa; | | |
| 1347 | var objc_msgsend_syms = std.AutoArrayHashMap(Symbol.Index, void).init(gpa); | | |
| 1348 | defer objc_msgsend_syms.deinit(); | | |
| 1349 | | | |
| 1350 | for (self.objects.items) |index| { | | |
| 1351 | const object = self.getFile(index).?.object; | | |
| 1352 | | | |
| 1353 | for (object.symbols.items, 0..) |sym_index, i| { | | |
| 1354 | const nlist_idx = @as(Symbol.Index, @intCast(i)); | | |
| 1355 | const nlist = object.symtab.items(.nlist)[nlist_idx]; | | |
| 1356 | if (!nlist.ext()) continue; | | |
| 1357 | if (!nlist.undf()) continue; | | |
| 1358 | | | |
| 1359 | const sym = self.getSymbol(sym_index); | | |
| 1360 | if (sym.getFile(self) != null) continue; | | |
| 1361 | if (mem.startsWith(u8, sym.getName(self), "_objc_msgSend$")) { | | |
| 1362 | _ = try objc_msgsend_syms.put(sym_index, {}); | | |
| 1363 | } | | |
| 1364 | } | | |
| 1365 | } | | |
| 1366 | | | |
| 1367 | for (objc_msgsend_syms.keys()) |sym_index| { | | |
| 1368 | const internal = self.getInternalObject().?; | | |
| 1369 | const sym = self.getSymbol(sym_index); | | |
| 1370 | _ = try internal.addSymbol(sym.getName(self), self); | | |
| 1371 | sym.visibility = .hidden; | | |
| 1372 | const name = eatPrefix(sym.getName(self), "_objc_msgSend$").?; | | |
| 1373 | const selrefs_index = try internal.addObjcMsgsendSections(name, self); | | |
| 1374 | try sym.addExtra(.{ .objc_selrefs = selrefs_index }, self); | | |
| 1375 | sym.flags.objc_stubs = true; | | |
| 1376 | } | | |
| 1377 | } | | |
| 1378 | | | |
| 1379 | pub fn dedupLiterals(self: *MachO) !void { | 1298 | pub fn dedupLiterals(self: *MachO) !void { |
| 1380 | const tracy = trace(@src()); | 1299 | const tracy = trace(@src()); |
| 1381 | defer tracy.end(); | 1300 | defer tracy.end(); |