aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-03-08 14:43:23 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-03-08 22:46:18 +0100
commitb34310356725fb1b955b6bec11da235efdc96bab (patch)
treed585dd804ebf9dbc740c2cb9c4e19dfc4f36b041 /src/link/Elf
parent7258d143e355f6bd92797cdb193c2b1ad2a1650d (diff)
downloadzig-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.zig23
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));