aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-29 21:12:56 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-31 09:33:49 +0100
commitd4966517f6d7204bb4c23204025cbd5ff3e06a03 (patch)
tree4189ac0c5e6c25370729bc2ddc0bfe4733cd833d /src
parent1ee628a3e08ab5a150e45e79a778ac04e7f8b1e0 (diff)
downloadzig-d4966517f6d7204bb4c23204025cbd5ff3e06a03.tar.gz
zig-d4966517f6d7204bb4c23204025cbd5ff3e06a03.zip
x86_64+macho: emit .got instead of .got_load relocs
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/Emit.zig8
-rw-r--r--src/link/MachO/ZigObject.zig15
2 files changed, 11 insertions, 12 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig
index 35d6935d77..b78b56efed 100644
--- a/src/arch/x86_64/Emit.zig
+++ b/src/arch/x86_64/Emit.zig
@@ -62,7 +62,7 @@ pub fn emitMir(emit: *Emit) Error!void {
.pcrel = true,
.has_subtractor = false,
.length = 2,
- .symbolnum = 0,
+ .symbolnum = @intCast(symbol.sym_index),
},
});
} else if (emit.lower.bin_file.cast(link.File.Coff)) |coff_file| {
@@ -165,7 +165,9 @@ pub fn emitMir(emit: *Emit) Error!void {
const @"type": link.File.MachO.Relocation.Type = if (sym.flags.needs_zig_got and !is_obj_or_static_lib)
.zig_got_load
else if (sym.flags.needs_got)
- .got_load
+ // TODO: it is possible to emit .got_load here that can potentially be relaxed
+ // however this requires always to use a MOVQ mnemonic
+ .got
else if (sym.flags.tlv)
.tlv
else
@@ -180,7 +182,7 @@ pub fn emitMir(emit: *Emit) Error!void {
.pcrel = true,
.has_subtractor = false,
.length = 2,
- .symbolnum = 0,
+ .symbolnum = @intCast(data.sym_index),
},
});
} else unreachable,
diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig
index c05a03e673..0634cb68f7 100644
--- a/src/link/MachO/ZigObject.zig
+++ b/src/link/MachO/ZigObject.zig
@@ -390,7 +390,7 @@ pub fn getDeclVAddr(
.pcrel = false,
.has_subtractor = false,
.length = 3,
- .symbolnum = 0,
+ .symbolnum = @intCast(sym.nlist_idx),
},
});
return vaddr;
@@ -416,7 +416,7 @@ pub fn getAnonDeclVAddr(
.pcrel = false,
.has_subtractor = false,
.length = 3,
- .symbolnum = 0,
+ .symbolnum = @intCast(sym.nlist_idx),
},
});
return vaddr;
@@ -856,21 +856,18 @@ fn createTlvDescriptor(
atom.alignment = alignment;
atom.size = size;
- const tlv_bootstrap_index = blk: {
- const index = try self.getGlobalSymbol(macho_file, "_tlv_bootstrap", null);
- break :blk self.symbols.items[index];
- };
+ const tlv_bootstrap_index = try self.getGlobalSymbol(macho_file, "_tlv_bootstrap", null);
try atom.addReloc(macho_file, .{
.tag = .@"extern",
.offset = 0,
- .target = tlv_bootstrap_index,
+ .target = self.symbols.items[tlv_bootstrap_index],
.addend = 0,
.type = .unsigned,
.meta = .{
.pcrel = false,
.has_subtractor = false,
.length = 3,
- .symbolnum = 0,
+ .symbolnum = @intCast(tlv_bootstrap_index),
},
});
try atom.addReloc(macho_file, .{
@@ -883,7 +880,7 @@ fn createTlvDescriptor(
.pcrel = false,
.has_subtractor = false,
.length = 3,
- .symbolnum = 0,
+ .symbolnum = @intCast(macho_file.getSymbol(init_sym_index).nlist_idx),
},
});