aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-07-05 20:02:11 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-07-18 09:13:07 +0200
commitd136d06a77baeef8680b6a8f334922a8f70da2bf (patch)
tree0dc163399061de672322af731a7a886217982158 /src
parente2bfd6fc691a92f9dc36597a8febb03293b0f5ad (diff)
downloadzig-d136d06a77baeef8680b6a8f334922a8f70da2bf.tar.gz
zig-d136d06a77baeef8680b6a8f334922a8f70da2bf.zip
macho: handle ZigObject when calculating dyld relocs
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO/dyld_info/Rebase.zig15
-rw-r--r--src/link/MachO/dyld_info/bind.zig6
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| {