commit c4d820b3f160e96415c2095c828b53f4e972aa36 (tree)
parent d388d555d5abc06962e4e8a409a5fa28f8c4f84c
Author: Jakub Konka <kubkon@jakubkonka.com>
Date: Mon, 19 Aug 2024 10:03:40 +0200
elf: emit DTPOFF32/DTPOFF64 relocation for .debug* sections
Diffstat:
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig
@@ -246,11 +246,11 @@ pub fn flushModule(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !voi
.@"32" => .@"32",
.@"64" => .@"64",
};
- log.debug(" {s} <- r_off={x}, r_add={x}, r_type={s}", .{
+ log.debug(" {s} <- r_off={x}, r_add={x}, r_type={}", .{
self.symbol(target_sym_index).name(elf_file),
r_offset,
r_addend,
- @tagName(r_type),
+ relocation.fmtRelocType(@intFromEnum(r_type), elf_file.getTarget().cpu.arch),
});
atom_ptr.addRelocAssumeCapacity(.{
.r_offset = r_offset,
@@ -261,18 +261,19 @@ pub fn flushModule(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !voi
try relocs.ensureUnusedCapacity(gpa, unit.external_relocs.items.len);
for (unit.external_relocs.items) |reloc| {
+ const target_sym = self.symbol(reloc.target_sym);
const r_offset = unit.off + unit.header_len + unit.getEntry(reloc.source_entry).off + reloc.source_off;
const r_addend: i64 = @intCast(reloc.target_off);
const r_type: elf.R_X86_64 = switch (dwarf.address_size) {
- .@"32" => .@"32",
- .@"64" => .@"64",
+ .@"32" => if (target_sym.flags.is_tls) .DTPOFF32 else .@"32",
+ .@"64" => if (target_sym.flags.is_tls) .DTPOFF64 else .@"64",
else => unreachable,
};
- log.debug(" {s} <- r_off={x}, r_add={x}, r_type={s}", .{
- self.symbol(reloc.target_sym).name(elf_file),
+ log.debug(" {s} <- r_off={x}, r_add={x}, r_type={}", .{
+ target_sym.name(elf_file),
r_offset,
r_addend,
- @tagName(r_type),
+ relocation.fmtRelocType(@intFromEnum(r_type), elf_file.getTarget().cpu.arch),
});
atom_ptr.addRelocAssumeCapacity(.{
.r_offset = r_offset,