Commit f0df0acd70
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");
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];