| ... | @@ -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_GOT32 | 113 | try atom.addReloc(elf_file, .{ |
| 114 | else if (sym.flags.needs_got) | 114 | .r_offset = end_offset - 4, |
| 115 | std.elf.R_X86_64_GOT32 | 115 | .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | std.elf.R_X86_64_PC32, |
| 116 | else | 116 | .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, |