authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-06 19:29:18+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-09 10:54:49+02:00
log216b03ad617912adace12a3fc1391710ce35d7ec
tree7ddf82734e249f8cf87a2131c281351593ad101f
parente6ae122839c4939ed4780e32261ea60c2bf9041b
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: implement some generic TLS symbol relocations for sparc


1 files changed, 36 insertions(+), 9 deletions(-)

src/link/Elf2.zig+36-9
......@@ -6197,8 +6197,6 @@ fn addRelocAssumeCapacity(
61976197 .GOT64_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs64_hi12),
61986198 },
61996199 .SPARCV9 => switch (@"type".SPARC) {
6200 else => std.debug.panic("TODO: unsupported input relocation, {t}", .{@"type".SPARC}),
6201
62026200 _,
62036201 .NONE,
62046202 .COPY,
......@@ -6241,6 +6239,20 @@ fn addRelocAssumeCapacity(
62416239 .M44,
62426240 .L44,
62436241 .REGISTER,
6242 .TLS_GD_HI22,
6243 .TLS_GD_LO10,
6244 .TLS_GD_CALL,
6245 .TLS_LDM_HI22,
6246 .TLS_LDM_LO10,
6247 .TLS_LDM_CALL,
6248 .TLS_LDO_HIX22,
6249 .TLS_LDO_LOX10,
6250 .TLS_IE_HI22,
6251 .TLS_IE_LO10,
6252 .TLS_LE_HIX22,
6253 .TLS_LE_LOX10,
6254 .TLS_DTPMOD32,
6255 .TLS_DTPMOD64,
62446256 .H34,
62456257 .WDISP10,
62466258 => |t| @panic("TODO: " ++ @tagName(t)),
......@@ -6264,6 +6276,18 @@ fn addRelocAssumeCapacity(
62646276 .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64),
62656277
62666278 // Relocations targeting a TLS symbol
6279 .TLS_DTPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff32),
6280 .TLS_DTPOFF64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff64),
6281 .TLS_TPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32),
6282 .TLS_TPOFF64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff64),
6283 // We currently do no relaxation, so nothing to do for these.
6284 .TLS_GD_ADD,
6285 .TLS_LDM_ADD,
6286 .TLS_LDO_ADD,
6287 .TLS_IE_LD,
6288 .TLS_IE_LDX,
6289 .TLS_IE_ADD,
6290 => {},
62676291
62686292 // Relocations targeting a GOT entry
62696293 .GOT10 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_10),
......@@ -6400,10 +6424,10 @@ fn addSymbolRelocAssumeCapacity(
64006424 .rel16 => .DISP16,
64016425 .rel8 => .DISP8,
64026426 .pltabs64, .pltabs32, .pltrel64, .pltrel32 => break :r .none,
6403 .dtpoff64 => @panic("TODO: dtpoff64"),
6404 .dtpoff32 => @panic("TODO: dtpoff32"),
6405 .tpoff64 => @panic("TODO: tpoff64"),
6406 .tpoff32 => @panic("TODO: tpoff32"),
6427 .dtpoff64 => .TLS_DTPOFF64,
6428 .dtpoff32 => .TLS_DTPOFF32,
6429 .tpoff64 => .TLS_TPOFF64,
6430 .tpoff32 => .TLS_TPOFF32,
64076431 .size64 => .SIZE64,
64086432 .size32 => .SIZE32,
64096433
......@@ -6580,8 +6604,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
65806604 }
65816605 const reloc_type: MachineRelocType = switch (elf.ehdrField(.machine)) {
65826606 else => |machine| @panic(@tagName(machine)),
6583 .X86_64 => .{ .X86_64 = .TPOFF64 },
65846607 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_TPREL64 else .TLS_TPREL32 },
6608 .SPARCV9 => .{ .SPARC = if (elf.identClass() == .@"64") .TLS_TPOFF64 else .TLS_TPOFF32 },
6609 .X86_64 => .{ .X86_64 = .TPOFF64 },
65856610 };
65866611 break :val switch (sym_id.unwrap()) {
65876612 // For global symbols, just target the right dynsym with no addend.
......@@ -6629,8 +6654,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
66296654 .dynamic => .{ .reloc = .{
66306655 .type = switch (elf.ehdrField(.machine)) {
66316656 else => |machine| @panic(@tagName(machine)),
6632 .X86_64 => .{ .X86_64 = .DTPMOD64 },
66336657 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },
6658 .SPARCV9 => .{ .SPARC = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },
6659 .X86_64 => .{ .X86_64 = .DTPMOD64 },
66346660 },
66356661 .dynsym_index = switch (elf.classifySymbolValue(sym)) {
66366662 .static, .static_relative => 0,
......@@ -6647,8 +6673,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
66476673 .dynamic => .{ .reloc = .{
66486674 .type = switch (elf.ehdrField(.machine)) {
66496675 else => |machine| @panic(@tagName(machine)),
6650 .X86_64 => .{ .X86_64 = .DTPMOD64 },
66516676 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },
6677 .SPARCV9 => .{ .SPARC = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },
6678 .X86_64 => .{ .X86_64 = .DTPMOD64 },
66526679 },
66536680 .dynsym_index = 0,
66546681 .addend = 0,