From 4d5bf0f09a29eeb0eb7f3602825f1a0095b8427e Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 15 Aug 2024 14:23:36 +0200 Subject: [PATCH] x86_64: deref GOT pointer when requesting var value --- src/arch/x86_64/Lower.zig | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/arch/x86_64/Lower.zig b/src/arch/x86_64/Lower.zig index 4fab1b806d..15322ce4f6 100644 --- a/src/arch/x86_64/Lower.zig +++ b/src/arch/x86_64/Lower.zig @@ -402,7 +402,21 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) 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) }, + .mov => { + if (elf_sym.flags.is_extern_ptr) { + const reg = ops[0].reg; + lower.result_insts[lower.result_insts_len] = + try Instruction.new(.none, .mov, &[_]Operand{ + .{ .reg = reg.to64() }, + .{ .mem = Memory.rip(.qword, 0) }, + }); + lower.result_insts_len += 1; + break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{ .base = .{ + .reg = reg.to64(), + } }) }; + } + break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }; + }, else => unreachable, } else switch (mnemonic) { .call => break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{