diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-29 21:12:56 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-31 09:33:49 +0100 |
| commit | d4966517f6d7204bb4c23204025cbd5ff3e06a03 (patch) | |
| tree | 4189ac0c5e6c25370729bc2ddc0bfe4733cd833d /src | |
| parent | 1ee628a3e08ab5a150e45e79a778ac04e7f8b1e0 (diff) | |
| download | zig-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.zig | 8 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 15 |
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), }, }); |
