diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-02-17 11:29:06 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-02-17 11:29:06 +0100 |
| commit | 975862aca9a68f1d6fa786b6cef19bcc7b1aec2a (patch) | |
| tree | bd0c4783671214faa562fd29956ff00bae8b3e5b /src/arch | |
| parent | 601aa10b82a43a9d566e8de3cb784929185411b4 (diff) | |
| download | zig-975862aca9a68f1d6fa786b6cef19bcc7b1aec2a.tar.gz zig-975862aca9a68f1d6fa786b6cef19bcc7b1aec2a.zip | |
elf: add riscv dynamic relocs
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/x86_64/Emit.zig | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index b78b56efed..de510fb30c 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -43,9 +43,10 @@ pub fn emitMir(emit: *Emit) Error!void { .linker_extern_fn => |symbol| if (emit.lower.bin_file.cast(link.File.Elf)) |elf_file| { // Add relocation to the decl. const atom_ptr = elf_file.symbol(symbol.atom_index).atom(elf_file).?; + const r_type = @intFromEnum(std.elf.R_X86_64.R_X86_64_PLT32); try atom_ptr.addReloc(elf_file, .{ .r_offset = end_offset - 4, - .r_info = (@as(u64, @intCast(symbol.sym_index)) << 32) | std.elf.R_X86_64_PLT32, + .r_info = (@as(u64, @intCast(symbol.sym_index)) << 32) | r_type, .r_addend = -4, }); } else if (emit.lower.bin_file.cast(link.File.MachO)) |macho_file| { @@ -88,18 +89,20 @@ pub fn emitMir(emit: *Emit) Error!void { .linker_tlsld => |data| { const elf_file = emit.lower.bin_file.cast(link.File.Elf).?; const atom = elf_file.symbol(data.atom_index).atom(elf_file).?; + const r_type = @intFromEnum(std.elf.R_X86_64.R_X86_64_TLSLD); try atom.addReloc(elf_file, .{ .r_offset = end_offset - 4, - .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | std.elf.R_X86_64_TLSLD, + .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type, .r_addend = -4, }); }, .linker_dtpoff => |data| { const elf_file = emit.lower.bin_file.cast(link.File.Elf).?; const atom = elf_file.symbol(data.atom_index).atom(elf_file).?; + const r_type = @intFromEnum(std.elf.R_X86_64.R_X86_64_DTPOFF32); try atom.addReloc(elf_file, .{ .r_offset = end_offset - 4, - .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | std.elf.R_X86_64_DTPOFF32, + .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type, .r_addend = 0, }); }, @@ -119,9 +122,9 @@ pub fn emitMir(emit: *Emit) Error!void { const r_type: u32 = if (sym.flags.needs_zig_got and !is_obj_or_static_lib) link.File.Elf.R_X86_64_ZIG_GOTPCREL else if (sym.flags.needs_got) - std.elf.R_X86_64_GOTPCREL + @intFromEnum(std.elf.R_X86_64.R_X86_64_GOTPCREL) else - std.elf.R_X86_64_PC32; + @intFromEnum(std.elf.R_X86_64.R_X86_64_PC32); try atom.addReloc(elf_file, .{ .r_offset = end_offset - 4, .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type, @@ -129,20 +132,21 @@ pub fn emitMir(emit: *Emit) Error!void { }); } else { if (lowered_inst.encoding.mnemonic == .call and sym.flags.needs_zig_got and is_obj_or_static_lib) { + const r_type = @intFromEnum(std.elf.R_X86_64.R_X86_64_PC32); try atom.addReloc(elf_file, .{ .r_offset = end_offset - 4, - .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | std.elf.R_X86_64_PC32, + .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type, .r_addend = -4, }); } else { const r_type: u32 = if (sym.flags.needs_zig_got and !is_obj_or_static_lib) link.File.Elf.R_X86_64_ZIG_GOT32 else if (sym.flags.needs_got) - std.elf.R_X86_64_GOT32 + @intFromEnum(std.elf.R_X86_64.R_X86_64_GOT32) else if (sym.flags.is_tls) - std.elf.R_X86_64_TPOFF32 + @intFromEnum(std.elf.R_X86_64.R_X86_64_TPOFF32) else - std.elf.R_X86_64_32; + @intFromEnum(std.elf.R_X86_64.R_X86_64_32); try atom.addReloc(elf_file, .{ .r_offset = end_offset - 4, .r_info = (@as(u64, @intCast(data.sym_index)) << 32) | r_type, |
