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(...@@ -6197,8 +6197,6 @@ fn addRelocAssumeCapacity(
6197 .GOT64_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs64_hi12),6197 .GOT64_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs64_hi12),
6198 },6198 },
6199 .SPARCV9 => switch (@"type".SPARC) {6199 .SPARCV9 => switch (@"type".SPARC) {
6200 else => std.debug.panic("TODO: unsupported input relocation, {t}", .{@"type".SPARC}),
6201
6202 _,6200 _,
6203 .NONE,6201 .NONE,
6204 .COPY,6202 .COPY,
...@@ -6241,6 +6239,20 @@ fn addRelocAssumeCapacity(...@@ -6241,6 +6239,20 @@ fn addRelocAssumeCapacity(
6241 .M44,6239 .M44,
6242 .L44,6240 .L44,
6243 .REGISTER,6241 .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,
6244 .H34,6256 .H34,
6245 .WDISP10,6257 .WDISP10,
6246 => |t| @panic("TODO: " ++ @tagName(t)),6258 => |t| @panic("TODO: " ++ @tagName(t)),
...@@ -6264,6 +6276,18 @@ fn addRelocAssumeCapacity(...@@ -6264,6 +6276,18 @@ fn addRelocAssumeCapacity(
6264 .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64),6276 .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64),
62656277
6266 // Relocations targeting a TLS symbol6278 // 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
6268 // Relocations targeting a GOT entry6292 // Relocations targeting a GOT entry
6269 .GOT10 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_10),6293 .GOT10 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_10),
...@@ -6400,10 +6424,10 @@ fn addSymbolRelocAssumeCapacity(...@@ -6400,10 +6424,10 @@ fn addSymbolRelocAssumeCapacity(
6400 .rel16 => .DISP16,6424 .rel16 => .DISP16,
6401 .rel8 => .DISP8,6425 .rel8 => .DISP8,
6402 .pltabs64, .pltabs32, .pltrel64, .pltrel32 => break :r .none,6426 .pltabs64, .pltabs32, .pltrel64, .pltrel32 => break :r .none,
6403 .dtpoff64 => @panic("TODO: dtpoff64"),6427 .dtpoff64 => .TLS_DTPOFF64,
6404 .dtpoff32 => @panic("TODO: dtpoff32"),6428 .dtpoff32 => .TLS_DTPOFF32,
6405 .tpoff64 => @panic("TODO: tpoff64"),6429 .tpoff64 => .TLS_TPOFF64,
6406 .tpoff32 => @panic("TODO: tpoff32"),6430 .tpoff32 => .TLS_TPOFF32,
6407 .size64 => .SIZE64,6431 .size64 => .SIZE64,
6408 .size32 => .SIZE32,6432 .size32 => .SIZE32,
64096433
...@@ -6580,8 +6604,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {...@@ -6580,8 +6604,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
6580 }6604 }
6581 const reloc_type: MachineRelocType = switch (elf.ehdrField(.machine)) {6605 const reloc_type: MachineRelocType = switch (elf.ehdrField(.machine)) {
6582 else => |machine| @panic(@tagName(machine)),6606 else => |machine| @panic(@tagName(machine)),
6583 .X86_64 => .{ .X86_64 = .TPOFF64 },
6584 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_TPREL64 else .TLS_TPREL32 },6607 .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 },
6585 };6610 };
6586 break :val switch (sym_id.unwrap()) {6611 break :val switch (sym_id.unwrap()) {
6587 // For global symbols, just target the right dynsym with no addend.6612 // For global symbols, just target the right dynsym with no addend.
...@@ -6629,8 +6654,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {...@@ -6629,8 +6654,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
6629 .dynamic => .{ .reloc = .{6654 .dynamic => .{ .reloc = .{
6630 .type = switch (elf.ehdrField(.machine)) {6655 .type = switch (elf.ehdrField(.machine)) {
6631 else => |machine| @panic(@tagName(machine)),6656 else => |machine| @panic(@tagName(machine)),
6632 .X86_64 => .{ .X86_64 = .DTPMOD64 },
6633 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },6657 .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 },
6634 },6660 },
6635 .dynsym_index = switch (elf.classifySymbolValue(sym)) {6661 .dynsym_index = switch (elf.classifySymbolValue(sym)) {
6636 .static, .static_relative => 0,6662 .static, .static_relative => 0,
...@@ -6647,8 +6673,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {...@@ -6647,8 +6673,9 @@ fn updateGotEntry(elf: *Elf, got_index: usize) void {
6647 .dynamic => .{ .reloc = .{6673 .dynamic => .{ .reloc = .{
6648 .type = switch (elf.ehdrField(.machine)) {6674 .type = switch (elf.ehdrField(.machine)) {
6649 else => |machine| @panic(@tagName(machine)),6675 else => |machine| @panic(@tagName(machine)),
6650 .X86_64 => .{ .X86_64 = .DTPMOD64 },
6651 .LOONGARCH => .{ .LOONGARCH = if (elf.identClass() == .@"64") .TLS_DTPMOD64 else .TLS_DTPMOD32 },6676 .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 },
6652 },6679 },
6653 .dynsym_index = 0,6680 .dynsym_index = 0,
6654 .addend = 0,6681 .addend = 0,