aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-03-08 14:38:21 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-03-08 22:46:17 +0100
commit7258d143e355f6bd92797cdb193c2b1ad2a1650d (patch)
tree650ad29890e808d52ac69f478cdd29e1e49037e0 /src
parentb5642b4f85e7962ee7eb3d137e47fadf392a865b (diff)
downloadzig-7258d143e355f6bd92797cdb193c2b1ad2a1650d.tar.gz
zig-7258d143e355f6bd92797cdb193c2b1ad2a1650d.zip
elf+aarch64: fix incorrectly emitted TLSDESC relocs
Diffstat (limited to 'src')
-rw-r--r--src/link/Elf/synthetic_sections.zig16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/link/Elf/synthetic_sections.zig b/src/link/Elf/synthetic_sections.zig
index 04a3793561..b55e5de432 100644
--- a/src/link/Elf/synthetic_sections.zig
+++ b/src/link/Elf/synthetic_sections.zig
@@ -634,8 +634,17 @@ pub const GotSection = struct {
}
},
.tlsdesc => {
- try writeInt(0, elf_file, writer);
- try writeInt(0, elf_file, writer);
+ if (symbol.?.flags.import) {
+ try writeInt(0, elf_file, writer);
+ try writeInt(0, elf_file, writer);
+ } else {
+ try writeInt(0, elf_file, writer);
+ const offset = if (apply_relocs)
+ @as(i64, @intCast(symbol.?.address(.{}, elf_file))) - @as(i64, @intCast(elf_file.tlsAddress()))
+ else
+ 0;
+ try writeInt(offset, elf_file, writer);
+ }
},
}
}
@@ -738,8 +747,9 @@ pub const GotSection = struct {
const offset = symbol.?.tlsDescAddress(elf_file);
elf_file.addRelaDynAssumeCapacity(.{
.offset = offset,
- .sym = extra.?.dynamic,
+ .sym = if (symbol.?.flags.import) extra.?.dynamic else 0,
.type = relocation.encode(.tlsdesc, cpu_arch),
+ .addend = if (symbol.?.flags.import) 0 else @intCast(symbol.?.address(.{}, elf_file) - elf_file.tlsAddress()),
});
},
}