authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-06 20:13:03+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-09 10:54:49+02:00
log429a5d948b37368d292aa718b4bfae0197a0128c
tree1ecf8b6e62e2f314aa3f1e4896707e63b5652afb
parent216b03ad617912adace12a3fc1391710ce35d7ec
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: implement some sparc-specific symbol relocations


1 files changed, 91 insertions(+), 8 deletions(-)

src/link/Elf2.zig+91-8
......@@ -1165,6 +1165,14 @@ const SymbolReloc = struct {
11651165 larch_tpoff64_lo20,
11661166 larch_tpoff64_hi12,
11671167
1168 sparc_wdisp30,
1169 sparc_pc10,
1170 sparc_pc22,
1171 sparc_wplt30,
1172 sparc_h44,
1173 sparc_m44,
1174 sparc_l44,
1175
11681176 fn dependsOnTlsSize(t: SymbolReloc.Type) bool {
11691177 return switch (t) {
11701178 .tpoff32, .tpoff64 => true,
......@@ -1499,6 +1507,55 @@ const SymbolReloc = struct {
14991507 assert(elf.ehdrField(.machine) == .LOONGARCH);
15001508 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52));
15011509 },
1510
1511 .sparc_wdisp30 => {
1512 const dest_ptr: *link.sparc.reloc.Disp30 = @ptrCast(@alignCast(dest_slice));
1513 var result = elf.targetLoad(dest_ptr);
1514 result.disp30 = @truncate((target_value -% dest_vaddr) >> 2);
1515 elf.targetStore(dest_ptr, result);
1516 },
1517 .sparc_pc10 => {
1518 const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice));
1519 var result = elf.targetLoad(dest_ptr);
1520 result.simm13 = @as(u10, @truncate(target_value -% dest_vaddr));
1521 elf.targetStore(dest_ptr, result);
1522 },
1523 .sparc_pc22 => {
1524 const dest_ptr: *link.sparc.reloc.Disp22 = @ptrCast(@alignCast(dest_slice));
1525 var result = elf.targetLoad(dest_ptr);
1526 result.disp22 = @truncate((target_value -% dest_vaddr) >> 10);
1527 elf.targetStore(dest_ptr, result);
1528 },
1529 .sparc_wplt30 => {
1530 const plt_index = switch (reloc.target.unwrap()) {
1531 .local => continue :type .sparc_wdisp30,
1532 .global => |name| elf.plt.getIndex(name) orelse continue :type .sparc_wdisp30,
1533 };
1534 if (elf.pltEntryIsDead(plt_index)) continue :type .sparc_wdisp30;
1535 const plt_entry = elf.shndx.plt.vaddr(elf) +% (4 + plt_index) * 32;
1536 const dest_ptr: *link.sparc.reloc.Disp30 = @ptrCast(@alignCast(dest_slice));
1537 var result = elf.targetLoad(dest_ptr);
1538 result.disp30 = @truncate((plt_entry +% @as(u64, @bitCast(reloc.addend)) -% dest_vaddr) >> 2);
1539 elf.targetStore(dest_ptr, result);
1540 },
1541 .sparc_h44 => {
1542 const dest_ptr: *link.sparc.reloc.Imm22 = @ptrCast(@alignCast(dest_slice));
1543 var result = elf.targetLoad(dest_ptr);
1544 result.imm22 = @truncate(target_value >> 22);
1545 elf.targetStore(dest_ptr, result);
1546 },
1547 .sparc_m44 => {
1548 const dest_ptr: *link.sparc.reloc.Imm10 = @ptrCast(@alignCast(dest_slice));
1549 var result = elf.targetLoad(dest_ptr);
1550 result.imm10 = @truncate(target_value >> 12);
1551 elf.targetStore(dest_ptr, result);
1552 },
1553 .sparc_l44 => {
1554 const dest_ptr: *link.sparc.reloc.Imm13 = @ptrCast(@alignCast(dest_slice));
1555 var result = elf.targetLoad(dest_ptr);
1556 result.imm13 = @as(u12, @truncate(target_value));
1557 elf.targetStore(dest_ptr, result);
1558 },
15021559 }
15031560 }
15041561
......@@ -6206,15 +6263,11 @@ fn addRelocAssumeCapacity(
62066263 .IRELATIVE,
62076264 => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}),
62086265
6209 inline .WDISP30,
6210 .WDISP22,
6266 inline .WDISP22,
62116267 .HI22,
62126268 .@"22",
62136269 .@"13",
62146270 .LO10,
6215 .PC10,
6216 .PC22,
6217 .WPLT30,
62186271 .HIPLT22,
62196272 .LOPLT10,
62206273 .PCPLT22,
......@@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity(
62356288 .@"6",
62366289 .HIX22,
62376290 .LOX10,
6238 .H44,
6239 .M44,
6240 .L44,
62416291 .REGISTER,
62426292 .TLS_GD_HI22,
62436293 .TLS_GD_LO10,
......@@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity(
62646314 .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8),
62656315 .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16),
62666316 .DISP32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32),
6317 .WDISP30 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_wdisp30),
6318 .PC10 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_pc10),
6319 .PC22 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_pc22),
6320 .WPLT30 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_wplt30),
62676321 .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32),
62686322 .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32),
62696323 .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32),
62706324 .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),
62716325 .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64),
62726326 .PLT64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs64),
6327 .H44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_h44),
6328 .M44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_m44),
6329 .L44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_l44),
62736330 .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),
62746331 .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16),
62756332 .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32),
......@@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity(
63716428 .larch_tpoff64_lo20,
63726429 .larch_tpoff64_hi12,
63736430 => unreachable,
6431
6432 .sparc_wdisp30,
6433 .sparc_pc10,
6434 .sparc_pc22,
6435 .sparc_wplt30,
6436 .sparc_h44,
6437 .sparc_m44,
6438 .sparc_l44,
6439 => unreachable,
63746440 } },
63756441 .LOONGARCH => .{ .LOONGARCH = switch (@"type") {
63766442 .write_rela => unreachable,
......@@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity(
64076473 .larch_tpoff32_hi20 => .TLS_LE_HI20,
64086474 .larch_tpoff64_lo20 => .TLS_LE64_LO20,
64096475 .larch_tpoff64_hi12 => .TLS_LE64_HI12,
6476
6477 .sparc_wdisp30,
6478 .sparc_pc10,
6479 .sparc_pc22,
6480 .sparc_wplt30,
6481 .sparc_h44,
6482 .sparc_m44,
6483 .sparc_l44,
6484 => unreachable,
64106485 } },
64116486 .SPARCV9 => .{ .SPARC = switch (@"type") {
64126487 .write_rela => unreachable,
......@@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity(
64446519 .larch_tpoff64_lo20,
64456520 .larch_tpoff64_hi12,
64466521 => unreachable,
6522
6523 .sparc_wdisp30 => .WDISP30,
6524 .sparc_pc10 => .PC10,
6525 .sparc_pc22 => .PC22,
6526 .sparc_wplt30 => .WPLT30,
6527 .sparc_h44 => .H44,
6528 .sparc_m44 => .M44,
6529 .sparc_l44 => .L44,
64476530 } },
64486531 };
64496532