diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 14:38:21 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-03-08 22:46:17 +0100 |
| commit | 7258d143e355f6bd92797cdb193c2b1ad2a1650d (patch) | |
| tree | 650ad29890e808d52ac69f478cdd29e1e49037e0 /src | |
| parent | b5642b4f85e7962ee7eb3d137e47fadf392a865b (diff) | |
| download | zig-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.zig | 16 |
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()), }); }, } |
