authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-03-08 14:46:23+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-03-08 22:46:18+01:00
log47100bd40a026710076d2d9be6e03937201e8adc
treee77ca2123b01dd368b27de13012fca89961e7274
parentb34310356725fb1b955b6bec11da235efdc96bab

elf+aarch64: handle TLS GD model


1 files changed, 24 insertions(+), 1 deletions(-)

src/link/Elf/Atom.zig+24-1
......@@ -1634,9 +1634,16 @@ const aarch64 = struct {
16341634 symbol.flags.needs_gottp = true;
16351635 },
16361636
1637 .TLSGD_ADR_PAGE21,
1638 .TLSGD_ADD_LO12_NC,
1639 => {
1640 symbol.flags.needs_tlsgd = true;
1641 },
1642
16371643 .TLSDESC_ADR_PAGE21,
16381644 .TLSDESC_LD64_LO12,
16391645 .TLSDESC_ADD_LO12,
1646 .TLSDESC_CALL,
16401647 => {
16411648 const should_relax = elf_file.base.isStatic() or (!is_dyn_lib and !symbol.flags.import);
16421649 if (!should_relax) {
......@@ -1651,7 +1658,6 @@ const aarch64 = struct {
16511658 .LDST32_ABS_LO12_NC,
16521659 .LDST64_ABS_LO12_NC,
16531660 .LDST128_ABS_LO12_NC,
1654 .TLSDESC_CALL,
16551661 => {},
16561662
16571663 else => try atom.reportUnhandledRelocError(rel, elf_file),
......@@ -1792,6 +1798,23 @@ const aarch64 = struct {
17921798 aarch64_util.writeLoadStoreRegInst(offset, code);
17931799 },
17941800
1801 .TLSGD_ADR_PAGE21 => {
1802 const S_: i64 = @intCast(target.tlsGdAddress(elf_file));
1803 const saddr: u64 = @intCast(P);
1804 const taddr: u64 = @intCast(S_ + A);
1805 relocs_log.debug(" [{x} => {x}]", .{ P, taddr });
1806 const pages: u21 = @bitCast(try aarch64_util.calcNumberOfPages(saddr, taddr));
1807 aarch64_util.writeAdrpInst(pages, code);
1808 },
1809
1810 .TLSGD_ADD_LO12_NC => {
1811 const S_: i64 = @intCast(target.tlsGdAddress(elf_file));
1812 const taddr: u64 = @intCast(S_ + A);
1813 relocs_log.debug(" [{x} => {x}]", .{ P, taddr });
1814 const offset: u12 = @truncate(taddr);
1815 aarch64_util.writeAddImmInst(offset, code);
1816 },
1817
17951818 .TLSDESC_ADR_PAGE21 => {
17961819 if (target.flags.has_tlsdesc) {
17971820 const S_: i64 = @intCast(target.tlsDescAddress(elf_file));