aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-10-27 00:08:31 +0200
committerJacob Young <jacobly0@users.noreply.github.com>2023-10-28 03:48:18 -0400
commit0d00b7c585f0e3a20ace71105f562bd7bdd14489 (patch)
tree1ae58fba48d94a4078c81c981b17d5c933459d8f /src
parent9a1fbb27059ec59b2e6f61c713b9c3120125a3da (diff)
downloadzig-0d00b7c585f0e3a20ace71105f562bd7bdd14489.tar.gz
zig-0d00b7c585f0e3a20ace71105f562bd7bdd14489.zip
elf: set needs_got on generated extern vars
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/Emit.zig2
-rw-r--r--src/codegen.zig1
-rw-r--r--src/link/Elf.zig3
3 files changed, 4 insertions, 2 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig
index c6671b82d5..4b49c51977 100644
--- a/src/arch/x86_64/Emit.zig
+++ b/src/arch/x86_64/Emit.zig
@@ -84,7 +84,7 @@ pub fn emitMir(emit: *Emit) Error!void {
if (emit.bin_file.options.pic) {
const r_type: u32 = if (sym.flags.has_zig_got)
link.File.Elf.R_X86_64_ZIG_GOTPCREL
- else if (sym.flags.has_got)
+ else if (sym.flags.needs_got)
std.elf.R_X86_64_GOTPCREL
else
std.elf.R_X86_64_PC32;
diff --git a/src/codegen.zig b/src/codegen.zig
index e6ac1ee2e1..3f2863ed7d 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -904,6 +904,7 @@ fn genDeclRef(
else
null;
const sym_index = try elf_file.getGlobalSymbol(name, lib_name);
+ elf_file.symbol(elf_file.zigModulePtr().symbol(sym_index)).flags.needs_got = true;
return GenResult.mcv(.{ .lea_symbol = sym_index });
}
const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index b03bdfbc7e..f5d6a78298 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -3333,7 +3333,8 @@ pub fn updateDecl(
const variable = decl.getOwnedVariable(mod).?;
const name = mod.intern_pool.stringToSlice(decl.name);
const lib_name = mod.intern_pool.stringToSliceUnwrap(variable.lib_name);
- _ = try self.getGlobalSymbol(name, lib_name);
+ const esym_index = try self.getGlobalSymbol(name, lib_name);
+ self.symbol(self.zigModulePtr().symbol(esym_index)).flags.needs_got = true;
return;
}