| ... | ... | @@ -1285,53 +1285,6 @@ fn markLive(self: *MachO) void { |
| 1285 | 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 | 1288 | fn convertTentativeDefsAndResolveSpecialSymbols(self: *MachO) !void { |
| 1336 | 1289 | for (self.objects.items) |index| { |
| 1337 | 1290 | try self.getFile(index).?.object.convertTentativeDefinitions(self); |
| ... | ... | @@ -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 | 1298 | pub fn dedupLiterals(self: *MachO) !void { |
| 1380 | 1299 | const tracy = trace(@src()); |
| 1381 | 1300 | defer tracy.end(); |