diff --git a/src/codegen/x86_64/Emit.zig b/src/codegen/x86_64/Emit.zig index 075648af1c4d4e65b5920acf3ee6b125daea7c48..9f12fb5ad081d977ed8ce834da71104670f2a1ae 100644 --- a/src/codegen/x86_64/Emit.zig +++ b/src/codegen/x86_64/Emit.zig @@ -850,8 +850,12 @@ fn encodeInst(emit: *Emit, lowered_inst: Instruction, reloc_info: []const RelocI emit.atom_id, end_offset - 4, target.symbol, - reloc.off, - .{ .X86_64 = .@"32S" }, + if (emit.pic) reloc.off - 4 else reloc.off, + .{ .X86_64 = rt: { + if (!emit.pic) break :rt .@"32S"; + if (target.is_extern and !target.force_pcrel_direct) break :rt .GOTPCREL; + break :rt .PC32; + } }, ) else if (emit.bin_file.cast(.coff2)) |coff| try coff.addReloc( @enumFromInt(@intFromEnum(emit.atom_id)), end_offset - 4,