From d136d06a77baeef8680b6a8f334922a8f70da2bf Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 5 Jul 2024 20:02:11 +0200 Subject: [PATCH] macho: handle ZigObject when calculating dyld relocs --- src/link/MachO/dyld_info/Rebase.zig | 15 ++++++++++++++- src/link/MachO/dyld_info/bind.zig | 6 ++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/link/MachO/dyld_info/Rebase.zig b/src/link/MachO/dyld_info/Rebase.zig index 8348aa01f8..9233a25e07 100644 --- a/src/link/MachO/dyld_info/Rebase.zig +++ b/src/link/MachO/dyld_info/Rebase.zig @@ -25,9 +25,10 @@ pub fn updateSize(rebase: *Rebase, macho_file: *MachO) !void { const gpa = macho_file.base.comp.gpa; - var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1); + var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 2); defer objects.deinit(); objects.appendSliceAssumeCapacity(macho_file.objects.items); + if (macho_file.getZigObject()) |obj| objects.appendAssumeCapacity(obj.index); if (macho_file.getInternalObject()) |obj| objects.appendAssumeCapacity(obj.index); for (objects.items) |index| { @@ -55,6 +56,18 @@ pub fn updateSize(rebase: *Rebase, macho_file: *MachO) !void { } } + if (macho_file.zig_got_sect_index) |sid| { + const seg_id = macho_file.sections.items(.segment_id)[sid]; + const seg = macho_file.segments.items[seg_id]; + for (0..macho_file.zig_got.entries.items.len) |idx| { + const addr = macho_file.zig_got.entryAddress(@intCast(idx), macho_file); + try rebase.entries.append(gpa, .{ + .offset = addr - seg.vmaddr, + .segment_id = seg_id, + }); + } + } + if (macho_file.got_sect_index) |sid| { const seg_id = macho_file.sections.items(.segment_id)[sid]; const seg = macho_file.segments.items[seg_id]; diff --git a/src/link/MachO/dyld_info/bind.zig b/src/link/MachO/dyld_info/bind.zig index 28e8b1d7d2..8684c66bac 100644 --- a/src/link/MachO/dyld_info/bind.zig +++ b/src/link/MachO/dyld_info/bind.zig @@ -35,9 +35,10 @@ pub const Bind = struct { const gpa = macho_file.base.comp.gpa; const cpu_arch = macho_file.getTarget().cpu.arch; - var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1); + var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 2); defer objects.deinit(); objects.appendSliceAssumeCapacity(macho_file.objects.items); + if (macho_file.getZigObject()) |obj| objects.appendAssumeCapacity(obj.index); if (macho_file.getInternalObject()) |obj| objects.appendAssumeCapacity(obj.index); for (objects.items) |index| { @@ -286,9 +287,10 @@ pub const WeakBind = struct { const gpa = macho_file.base.comp.gpa; const cpu_arch = macho_file.getTarget().cpu.arch; - var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1); + var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 2); defer objects.deinit(); objects.appendSliceAssumeCapacity(macho_file.objects.items); + if (macho_file.getZigObject()) |obj| objects.appendAssumeCapacity(obj.index); if (macho_file.getInternalObject()) |obj| objects.appendAssumeCapacity(obj.index); for (objects.items) |index| {