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

Elf2: implement some sparc-specific __tls_get_addr() relocations


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

src/link/Elf2.zig+9-6
...@@ -2918,12 +2918,12 @@ pub const ExternSymbolOpts = struct {...@@ -2918,12 +2918,12 @@ pub const ExternSymbolOpts = struct {
2918};2918};
2919pub fn externSymbol(elf: *Elf, opts: ExternSymbolOpts) link.Error!link.File.SymbolId {2919pub fn externSymbol(elf: *Elf, opts: ExternSymbolOpts) link.Error!link.File.SymbolId {
2920 const diags = &elf.base.comp.link_diags;2920 const diags = &elf.base.comp.link_diags;
2921 return elf.externSymbolInner(opts) catch |err| switch (err) {2921 return (elf.externSymbolInner(opts) catch |err| switch (err) {
2922 error.MappedFileIo => return diags.fail("failed to write output file: {t}", .{elf.mf.io_err.?}),2922 error.MappedFileIo => return diags.fail("failed to write output file: {t}", .{elf.mf.io_err.?}),
2923 else => |e| return e,2923 else => |e| return e,
2924 };2924 }).toTypeErased();
2925}2925}
2926fn externSymbolInner(elf: *Elf, opts: ExternSymbolOpts) Error!link.File.SymbolId {2926fn externSymbolInner(elf: *Elf, opts: ExternSymbolOpts) Error!Symbol.Id {
2927 try elf.ensureUnusedSymbolCapacity(1, .maybe_global);2927 try elf.ensureUnusedSymbolCapacity(1, .maybe_global);
2928 const symbol = elf.addGlobalSymbolAssumeCapacity(.{2928 const symbol = elf.addGlobalSymbolAssumeCapacity(.{
2929 .node = .none,2929 .node = .none,
...@@ -2947,7 +2947,7 @@ fn externSymbolInner(elf: *Elf, opts: ExternSymbolOpts) Error!link.File.SymbolId...@@ -2947,7 +2947,7 @@ fn externSymbolInner(elf: *Elf, opts: ExternSymbolOpts) Error!link.File.SymbolId
2947 }) catch |err| switch (err) {2947 }) catch |err| switch (err) {
2948 error.MultipleDefinitions => unreachable, // shndx is undef2948 error.MultipleDefinitions => unreachable, // shndx is undef
2949 };2949 };
2950 return symbol.toTypeErased();2950 return symbol;
2951}2951}
2952pub fn addReloc(2952pub fn addReloc(
2953 elf: *Elf,2953 elf: *Elf,
...@@ -6359,8 +6359,6 @@ fn addRelocAssumeCapacity(...@@ -6359,8 +6359,6 @@ fn addRelocAssumeCapacity(
6359 .REGISTER,6359 .REGISTER,
6360 .TLS_GD_HI22,6360 .TLS_GD_HI22,
6361 .TLS_GD_LO10,6361 .TLS_GD_LO10,
6362 .TLS_GD_CALL,
6363 .TLS_LDM_CALL,
6364 .TLS_IE_HI22,6362 .TLS_IE_HI22,
6365 .TLS_IE_LO10,6363 .TLS_IE_LO10,
6366 .TLS_DTPMOD32,6364 .TLS_DTPMOD32,
...@@ -6391,6 +6389,11 @@ fn addRelocAssumeCapacity(...@@ -6391,6 +6389,11 @@ fn addRelocAssumeCapacity(
6391 .L44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_l44),6389 .L44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_l44),
6392 .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),6390 .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64),
6393 .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16),6391 .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16),
6392 .TLS_GD_CALL, .TLS_LDM_CALL => try elf.addSymbolRelocAssumeCapacity(node, offset, try elf.externSymbolInner(.{
6393 .lib_name = null,
6394 .name = "__tls_get_addr",
6395 .type = .FUNC,
6396 }), addend, .sparc_wplt30),
6394 .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32),6397 .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32),
6395 .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64),6398 .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64),
63966399