authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-03 11:55:43+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-04 09:12:35+01:00
log912a774a1519756dd68e514e5b5ac3e4e6f4e511
treecdb9be32b5eff80c1cc475a6cce5280f7baebbaf
parent33a0a72e87bd01ce6dbd10fa327c74168a0166db

x86_64: rewrite call r/m64 to call rel32 for .got.zig refs when object


2 files changed, 22 insertions(+), 12 deletions(-)

src/arch/x86_64/Emit.zig+19-11
...@@ -109,17 +109,25 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -109,17 +109,25 @@ pub fn emitMir(emit: *Emit) Error!void {
109 .r_addend = -4,109 .r_addend = -4,
110 });110 });
111 } else {111 } else {
112 const r_type: u32 = if (sym.flags.needs_zig_got and !is_obj_or_static_lib)112 if (lowered_inst.encoding.mnemonic == .call and sym.flags.needs_zig_got and is_obj_or_static_lib) {
113 link.File.Elf.R_X86_64_ZIG_GOT32113 try atom.addReloc(elf_file, .{
114 else if (sym.flags.needs_got)114 .r_offset = end_offset - 4,
115 std.elf.R_X86_64_GOT32115 .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | std.elf.R_X86_64_PC32,
116 else116 .r_addend = -4,
117 std.elf.R_X86_64_32;117 });
118 try atom.addReloc(elf_file, .{118 } else {
119 .r_offset = end_offset - 4,119 const r_type: u32 = if (sym.flags.needs_zig_got and !is_obj_or_static_lib)
120 .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type,120 link.File.Elf.R_X86_64_ZIG_GOT32
121 .r_addend = 0,121 else if (sym.flags.needs_got)
122 });122 std.elf.R_X86_64_GOT32
123 else
124 std.elf.R_X86_64_32;
125 try atom.addReloc(elf_file, .{
126 .r_offset = end_offset - 4,
127 .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type,
128 .r_addend = 0,
129 });
130 }
123 }131 }
124 } else unreachable,132 } else unreachable,
125 .linker_got,133 .linker_got,
src/arch/x86_64/Lower.zig+3-1
...@@ -356,7 +356,9 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)...@@ -356,7 +356,9 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
356 },356 },
357 else => unreachable,357 else => unreachable,
358 } else switch (mnemonic) {358 } else switch (mnemonic) {
359 .call => .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{359 .call => break :op if (is_obj_or_static_lib and needsZigGot(sym, lower.bin_file)) .{
360 .imm = Immediate.s(0),
361 } else .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{
360 .base = .{ .reg = .ds },362 .base = .{ .reg = .ds },
361 }) },363 }) },
362 .lea => {364 .lea => {