diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-14 09:04:08 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-16 19:33:06 +0200 |
| commit | 17635e4f2ae78e358a7a997b161e64de71a01191 (patch) | |
| tree | dc688f054c6a6c1ab7d7e96f3cfc1c3bb127e44e /src/codegen.zig | |
| parent | b3d98a4b88514b1e8d2cc07ef05c218f50f5f5d8 (diff) | |
| download | zig-17635e4f2ae78e358a7a997b161e64de71a01191.tar.gz zig-17635e4f2ae78e358a7a997b161e64de71a01191.zip | |
x86_64: add -fPIC support targeting ELF
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index e2ebcecee2..b5f7f3885e 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -890,7 +890,11 @@ fn genDeclRef( const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index); const sym = elf_file.symbol(sym_index); _ = try sym.getOrCreateZigGotEntry(sym_index, elf_file); - return GenResult.mcv(.{ .memory = sym.zigGotAddress(elf_file) }); + if (bin_file.options.pic) { + return GenResult.mcv(.{ .load_got = sym.esym_index }); + } else { + return GenResult.mcv(.{ .memory = sym.zigGotAddress(elf_file) }); + } } else if (bin_file.cast(link.File.MachO)) |macho_file| { const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index); const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?; @@ -925,7 +929,12 @@ fn genUnnamedConst( return GenResult.fail(bin_file.allocator, src_loc, "lowering unnamed constant failed: {s}", .{@errorName(err)}); }; if (bin_file.cast(link.File.Elf)) |elf_file| { - return GenResult.mcv(.{ .memory = elf_file.symbol(local_sym_index).value }); + const local = elf_file.symbol(local_sym_index); + if (bin_file.options.pic) { + return GenResult.mcv(.{ .load_direct = local.esym_index }); + } else { + return GenResult.mcv(.{ .memory = local.value }); + } } else if (bin_file.cast(link.File.MachO)) |_| { return GenResult.mcv(.{ .load_direct = local_sym_index }); } else if (bin_file.cast(link.File.Coff)) |_| { |
