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 {...@@ -1165,6 +1165,14 @@ const SymbolReloc = struct {
1165 larch_tpoff64_lo20,1165 larch_tpoff64_lo20,
1166 larch_tpoff64_hi12,1166 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
1168 fn dependsOnTlsSize(t: SymbolReloc.Type) bool {1176 fn dependsOnTlsSize(t: SymbolReloc.Type) bool {
1169 return switch (t) {1177 return switch (t) {
1170 .tpoff32, .tpoff64 => true,1178 .tpoff32, .tpoff64 => true,
...@@ -1499,6 +1507,55 @@ const SymbolReloc = struct {...@@ -1499,6 +1507,55 @@ const SymbolReloc = struct {
1499 assert(elf.ehdrField(.machine) == .LOONGARCH);1507 assert(elf.ehdrField(.machine) == .LOONGARCH);
1500 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52));1508 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52));
1501 },1509 },
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 },
1502 }1559 }
1503 }1560 }
15041561
...@@ -6206,15 +6263,11 @@ fn addRelocAssumeCapacity(...@@ -6206,15 +6263,11 @@ fn addRelocAssumeCapacity(
6206 .IRELATIVE,6263 .IRELATIVE,
6207 => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}),6264 => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}),
62086265
6209 inline .WDISP30,6266 inline .WDISP22,
6210 .WDISP22,
6211 .HI22,6267 .HI22,
6212 .@"22",6268 .@"22",
6213 .@"13",6269 .@"13",
6214 .LO10,6270 .LO10,
6215 .PC10,
6216 .PC22,
6217 .WPLT30,
6218 .HIPLT22,6271 .HIPLT22,
6219 .LOPLT10,6272 .LOPLT10,
6220 .PCPLT22,6273 .PCPLT22,
...@@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity(...@@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity(
6235 .@"6",6288 .@"6",
6236 .HIX22,6289 .HIX22,
6237 .LOX10,6290 .LOX10,
6238 .H44,
6239 .M44,
6240 .L44,
6241 .REGISTER,6291 .REGISTER,
6242 .TLS_GD_HI22,6292 .TLS_GD_HI22,
6243 .TLS_GD_LO10,6293 .TLS_GD_LO10,
...@@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity(...@@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity(
6264 .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8),6314 .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8),
6265 .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16),6315 .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16),
6266 .DISP32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32),6316 .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),
6267 .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32),6321 .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32),
6268 .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32),6322 .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32),
6269 .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32),6323 .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32),
6270 .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),6324 .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),
6271 .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64),6325 .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64),
6272 .PLT64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs64),6326 .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),
6273 .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),6330 .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),
6274 .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16),6331 .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16),
6275 .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32),6332 .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32),
...@@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity(...@@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity(
6371 .larch_tpoff64_lo20,6428 .larch_tpoff64_lo20,
6372 .larch_tpoff64_hi12,6429 .larch_tpoff64_hi12,
6373 => unreachable,6430 => 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,
6374 } },6440 } },
6375 .LOONGARCH => .{ .LOONGARCH = switch (@"type") {6441 .LOONGARCH => .{ .LOONGARCH = switch (@"type") {
6376 .write_rela => unreachable,6442 .write_rela => unreachable,
...@@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity(...@@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity(
6407 .larch_tpoff32_hi20 => .TLS_LE_HI20,6473 .larch_tpoff32_hi20 => .TLS_LE_HI20,
6408 .larch_tpoff64_lo20 => .TLS_LE64_LO20,6474 .larch_tpoff64_lo20 => .TLS_LE64_LO20,
6409 .larch_tpoff64_hi12 => .TLS_LE64_HI12,6475 .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,
6410 } },6485 } },
6411 .SPARCV9 => .{ .SPARC = switch (@"type") {6486 .SPARCV9 => .{ .SPARC = switch (@"type") {
6412 .write_rela => unreachable,6487 .write_rela => unreachable,
...@@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity(...@@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity(
6444 .larch_tpoff64_lo20,6519 .larch_tpoff64_lo20,
6445 .larch_tpoff64_hi12,6520 .larch_tpoff64_hi12,
6446 => unreachable,6521 => 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,
6447 } },6530 } },
6448 };6531 };
64496532