authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-18 23:00:55+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-21 22:44:27+02:00
logc6e916d7fe4234c821eeeff19a73b334129c00de
tree78bd853d86c12e8c06b58f7cc6a7e612bc78a6e0
parent711bc2cf3919a2010503610574e7dfcad8a17929

macho: fix runtime panics


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

src/link/MachO.zig+47-1
...@@ -3266,6 +3266,7 @@ fn collectRebaseData(self: *MachO, rebase: *Rebase) !void {...@@ -3266,6 +3266,7 @@ fn collectRebaseData(self: *MachO, rebase: *Rebase) !void {
3266 }3266 }
32673267
3268 // Gather GOT pointers3268 // Gather GOT pointers
3269 try rebase.entries.ensureUnusedCapacity(gpa, self.got_table.entries.items.len);
3269 const segment_index = self.sections.items(.segment_index)[self.got_section_index.?];3270 const segment_index = self.sections.items(.segment_index)[self.got_section_index.?];
3270 for (self.got_table.entries.items, 0..) |entry, i| {3271 for (self.got_table.entries.items, 0..) |entry, i| {
3271 if (!self.got_table.lookup.contains(entry)) continue;3272 if (!self.got_table.lookup.contains(entry)) continue;
...@@ -3324,6 +3325,7 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {...@@ -3324,6 +3325,7 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {
3324 }3325 }
33253326
3326 // Gather GOT pointers3327 // Gather GOT pointers
3328 try bind.entries.ensureUnusedCapacity(gpa, self.got_table.entries.items.len);
3327 const segment_index = self.sections.items(.segment_index)[self.got_section_index.?];3329 const segment_index = self.sections.items(.segment_index)[self.got_section_index.?];
3328 for (self.got_table.entries.items, 0..) |entry, i| {3330 for (self.got_table.entries.items, 0..) |entry, i| {
3329 if (!self.got_table.lookup.contains(entry)) continue;3331 if (!self.got_table.lookup.contains(entry)) continue;
...@@ -3352,6 +3354,50 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {...@@ -3352,6 +3354,50 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {
3352 try bind.finalize(gpa, self);3354 try bind.finalize(gpa, self);
3353}3355}
33543356
3357fn collectLazyBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {
3358 const gpa = self.base.allocator;
3359 const slice = self.sections.slice();
3360
3361 for (raw_bindings.keys(), 0..) |atom_index, i| {
3362 const atom = self.getAtom(atom_index);
3363 log.debug(" ATOM(%{?d}, '{s}')", .{ atom.getSymbolIndex(), atom.getName(self) });
3364
3365 const sym = atom.getSymbol(self);
3366 const segment_index = slice.items(.segment_index)[sym.n_sect - 1];
3367 const seg = self.getSegment(sym.n_sect - 1);
3368
3369 const base_offset = sym.n_value - seg.vmaddr;
3370
3371 const bindings = raw_bindings.values()[i];
3372 try bind.entries.ensureUnusedCapacity(gpa, bindings.items.len);
3373
3374 for (bindings.items) |binding| {
3375 const bind_sym = self.getSymbol(binding.target);
3376 const bind_sym_name = self.getSymbolName(binding.target);
3377 const dylib_ordinal = @divTrunc(
3378 @bitCast(i16, bind_sym.n_desc),
3379 macho.N_SYMBOL_RESOLVER,
3380 );
3381 log.debug(" | bind at {x}, import('{s}') in dylib({d})", .{
3382 binding.offset + base_offset,
3383 bind_sym_name,
3384 dylib_ordinal,
3385 });
3386 if (bind_sym.weakRef()) {
3387 log.debug(" | marking as weak ref ", .{});
3388 }
3389 bind.entries.appendAssumeCapacity(.{
3390 .target = binding.target,
3391 .offset = binding.offset + base_offset,
3392 .segment_id = segment_index,
3393 .addend = 0,
3394 });
3395 }
3396 }
3397
3398 try bind.finalize(gpa, self);
3399}
3400
3355fn collectExportData(self: *MachO, trie: *Trie) !void {3401fn collectExportData(self: *MachO, trie: *Trie) !void {
3356 const gpa = self.base.allocator;3402 const gpa = self.base.allocator;
33573403
...@@ -3395,7 +3441,7 @@ fn writeDyldInfoData(self: *MachO) !void {...@@ -3395,7 +3441,7 @@ fn writeDyldInfoData(self: *MachO) !void {
33953441
3396 var lazy_bind = LazyBind{};3442 var lazy_bind = LazyBind{};
3397 defer lazy_bind.deinit(gpa);3443 defer lazy_bind.deinit(gpa);
3398 try self.collectBindData(&lazy_bind, self.lazy_bindings);3444 try self.collectLazyBindData(&lazy_bind, self.lazy_bindings);
33993445
3400 var trie: Trie = .{};3446 var trie: Trie = .{};
3401 defer trie.deinit(gpa);3447 defer trie.deinit(gpa);