diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/Emit.zig | 4 | ||||
| -rw-r--r-- | src/arch/x86_64/Lower.zig | 9 |
2 files changed, 7 insertions, 6 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index fd1389eb3b..693dca1da6 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -124,9 +124,7 @@ pub fn emitMir(emit: *Emit) Error!void { .r_addend = -4, }); } else { - const r_type: u32 = if (sym.flags.is_extern_ptr) - @intFromEnum(std.elf.R_X86_64.GOT32) - else if (sym.flags.is_tls) + const r_type: u32 = if (sym.flags.is_tls) @intFromEnum(std.elf.R_X86_64.TPOFF32) else @intFromEnum(std.elf.R_X86_64.@"32"); diff --git a/src/arch/x86_64/Lower.zig b/src/arch/x86_64/Lower.zig index 56cd2669d6..4fab1b806d 100644 --- a/src/arch/x86_64/Lower.zig +++ b/src/arch/x86_64/Lower.zig @@ -397,8 +397,11 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) } _ = lower.reloc(.{ .linker_reloc = sym }); - break :op if (lower.pic) switch (mnemonic) { - .lea => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }, + if (lower.pic) switch (mnemonic) { + .lea => { + if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov; + break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }; + }, .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }, else => unreachable, } else switch (mnemonic) { @@ -413,7 +416,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) .base = .{ .reg = .ds }, }) }, else => unreachable, - }; + } } else if (lower.bin_file.cast(.macho)) |macho_file| { const zo = macho_file.getZigObject().?; const macho_sym = zo.symbols.items[sym.sym_index]; |
