diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 14:43:23 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 22:46:18 +0100 |
| commit | b34310356725fb1b955b6bec11da235efdc96bab (patch) | |
| tree | d585dd804ebf9dbc740c2cb9c4e19dfc4f36b041 /src/link/Elf | |
| parent | 7258d143e355f6bd92797cdb193c2b1ad2a1650d (diff) | |
| download | zig-b34310356725fb1b955b6bec11da235efdc96bab.tar.gz zig-b34310356725fb1b955b6bec11da235efdc96bab.zip | |
elf+aarch64: handle gottp and .tls_common
Diffstat (limited to 'src/link/Elf')
| -rw-r--r-- | src/link/Elf/Atom.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig index fca2fbef27..61705dfcdb 100644 --- a/src/link/Elf/Atom.zig +++ b/src/link/Elf/Atom.zig @@ -1628,6 +1628,12 @@ const aarch64 = struct { if (is_dyn_lib) try atom.reportPicError(symbol, rel, elf_file); }, + .TLSIE_ADR_GOTTPREL_PAGE21, + .TLSIE_LD64_GOTTPREL_LO12_NC, + => { + symbol.flags.needs_gottp = true; + }, + .TLSDESC_ADR_PAGE21, .TLSDESC_LD64_LO12, .TLSDESC_ADD_LO12, @@ -1769,6 +1775,23 @@ const aarch64 = struct { aarch64_util.writeAddImmInst(@bitCast(value), code); }, + .TLSIE_ADR_GOTTPREL_PAGE21 => { + const S_: i64 = @intCast(target.gotTpAddress(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); + }, + + .TLSIE_LD64_GOTTPREL_LO12_NC => { + const S_: i64 = @intCast(target.gotTpAddress(elf_file)); + const taddr: u64 = @intCast(S_ + A); + relocs_log.debug(" [{x} => {x}]", .{ P, taddr }); + const offset: u12 = try math.divExact(u12, @truncate(taddr), 8); + aarch64_util.writeLoadStoreRegInst(offset, code); + }, + .TLSDESC_ADR_PAGE21 => { if (target.flags.has_tlsdesc) { const S_: i64 = @intCast(target.tlsDescAddress(elf_file)); |
