authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-08-24 20:16:34+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-08-24 20:16:34+02:00
logaee6f14bcee7c96fcb65490cad96e06991caece7
treeb13864304e5fc44fa26cdcc09468ba094389c7a4
parent32ce8238a8f722a17a408bf9d15db4a74662ae71

macho: use existing rebase mechanism to rebase lazy pointers


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

src/link/MachO.zig+1-30
...@@ -2223,6 +2223,7 @@ fn createLazyPointerAtom(self: *MachO, stub_sym_index: u32) !*TextBlock {...@@ -2223,6 +2223,7 @@ fn createLazyPointerAtom(self: *MachO, stub_sym_index: u32) !*TextBlock {
2223 },2223 },
2224 },2224 },
2225 });2225 });
2226 try atom.rebases.append(self.base.allocator, 0);
2226 self.lazy_binding_info_dirty = true;2227 self.lazy_binding_info_dirty = true;
2227 return atom;2228 return atom;
2228}2229}
...@@ -3002,21 +3003,6 @@ fn writeRebaseInfoTableZld(self: *MachO) !void {...@@ -3002,21 +3003,6 @@ fn writeRebaseInfoTableZld(self: *MachO) !void {
3002 }3003 }
3003 }3004 }
30043005
3005 if (self.la_symbol_ptr_section_index) |idx| {
3006 const seg = self.load_commands.items[self.data_segment_cmd_index.?].Segment;
3007 const sect = seg.sections.items[idx];
3008 const base_offset = sect.addr - seg.inner.vmaddr;
3009 const segment_id = @intCast(u16, self.data_segment_cmd_index.?);
3010
3011 try pointers.ensureUnusedCapacity(self.stubs.items.len);
3012 for (self.stubs.items) |_, i| {
3013 pointers.appendAssumeCapacity(.{
3014 .offset = base_offset + i * @sizeOf(u64),
3015 .segment_id = segment_id,
3016 });
3017 }
3018 }
3019
3020 std.sort.sort(bind.Pointer, pointers.items, {}, bind.pointerCmp);3006 std.sort.sort(bind.Pointer, pointers.items, {}, bind.pointerCmp);
30213007
3022 const size = try bind.rebaseInfoSize(pointers.items);3008 const size = try bind.rebaseInfoSize(pointers.items);
...@@ -5104,21 +5090,6 @@ fn writeRebaseInfoTable(self: *MachO) !void {...@@ -5104,21 +5090,6 @@ fn writeRebaseInfoTable(self: *MachO) !void {
5104 }5090 }
5105 }5091 }
51065092
5107 if (self.la_symbol_ptr_section_index) |idx| {
5108 const seg = self.load_commands.items[self.data_segment_cmd_index.?].Segment;
5109 const sect = seg.sections.items[idx];
5110 const base_offset = sect.addr - seg.inner.vmaddr;
5111 const segment_id = @intCast(u16, self.data_segment_cmd_index.?);
5112
5113 try pointers.ensureUnusedCapacity(self.stubs.items.len);
5114 for (self.stubs.items) |_, i| {
5115 pointers.appendAssumeCapacity(.{
5116 .offset = base_offset + i * @sizeOf(u64),
5117 .segment_id = segment_id,
5118 });
5119 }
5120 }
5121
5122 std.sort.sort(bind.Pointer, pointers.items, {}, bind.pointerCmp);5093 std.sort.sort(bind.Pointer, pointers.items, {}, bind.pointerCmp);
51235094
5124 const size = try bind.rebaseInfoSize(pointers.items);5095 const size = try bind.rebaseInfoSize(pointers.items);