diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 14:46:23 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 22:46:18 +0100 |
| commit | 47100bd40a026710076d2d9be6e03937201e8adc (patch) | |
| tree | e77ca2123b01dd368b27de13012fca89961e7274 /src/link | |
| parent | b34310356725fb1b955b6bec11da235efdc96bab (diff) | |
| download | zig-47100bd40a026710076d2d9be6e03937201e8adc.tar.gz zig-47100bd40a026710076d2d9be6e03937201e8adc.zip | |
elf+aarch64: handle TLS GD model
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Elf/Atom.zig | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig index 61705dfcdb..63590402eb 100644 --- a/src/link/Elf/Atom.zig +++ b/src/link/Elf/Atom.zig @@ -1634,9 +1634,16 @@ const aarch64 = struct { symbol.flags.needs_gottp = true; }, + .TLSGD_ADR_PAGE21, + .TLSGD_ADD_LO12_NC, + => { + symbol.flags.needs_tlsgd = true; + }, + .TLSDESC_ADR_PAGE21, .TLSDESC_LD64_LO12, .TLSDESC_ADD_LO12, + .TLSDESC_CALL, => { const should_relax = elf_file.base.isStatic() or (!is_dyn_lib and !symbol.flags.import); if (!should_relax) { @@ -1651,7 +1658,6 @@ const aarch64 = struct { .LDST32_ABS_LO12_NC, .LDST64_ABS_LO12_NC, .LDST128_ABS_LO12_NC, - .TLSDESC_CALL, => {}, else => try atom.reportUnhandledRelocError(rel, elf_file), @@ -1792,6 +1798,23 @@ const aarch64 = struct { aarch64_util.writeLoadStoreRegInst(offset, code); }, + .TLSGD_ADR_PAGE21 => { + const S_: i64 = @intCast(target.tlsGdAddress(elf_file)); + const saddr: u64 = @intCast(P); + const taddr: u64 = @intCast(S_ + A); + relocs_log.debug(" [{x} => {x}]", .{ P, taddr }); + const pages: u21 = @bitCast(try aarch64_util.calcNumberOfPages(saddr, taddr)); + aarch64_util.writeAdrpInst(pages, code); + }, + + .TLSGD_ADD_LO12_NC => { + const S_: i64 = @intCast(target.tlsGdAddress(elf_file)); + const taddr: u64 = @intCast(S_ + A); + relocs_log.debug(" [{x} => {x}]", .{ P, taddr }); + const offset: u12 = @truncate(taddr); + aarch64_util.writeAddImmInst(offset, code); + }, + .TLSDESC_ADR_PAGE21 => { if (target.flags.has_tlsdesc) { const S_: i64 = @intCast(target.tlsDescAddress(elf_file)); |
