Commit d5233ee85c
Changed files (5)
src/link/Coff.zig
@@ -1133,6 +1133,10 @@ fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Node) !
}
}
+ for (self.base.options.force_undefined_symbols.keys()) |symbol| {
+ try argv.append(try allocPrint(arena, "-INCLUDE:{s}", .{symbol}));
+ }
+
if (is_dyn_lib) {
try argv.append("-DLL");
}
src/link/Elf.zig
@@ -1448,6 +1448,11 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
try argv.append(entry);
}
+ for (self.base.options.force_undefined_symbols.keys()) |symbol| {
+ try argv.append("-u");
+ try argv.append(symbol);
+ }
+
switch (self.base.options.hash_style) {
.gnu => try argv.append("--hash-style=gnu"),
.sysv => try argv.append("--hash-style=sysv"),
src/Compilation.zig
@@ -1165,9 +1165,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
break :blk false;
} else if (options.c_source_files.len == 0) {
break :blk false;
- } else if (options.target.os.tag == .windows and link_libcpp) {
- // https://github.com/ziglang/zig/issues/8531
- break :blk false;
} else if (options.target.cpu.arch.isRISCV()) {
// Clang and LLVM currently don't support RISC-V target-abi for LTO.
// Compiling with LTO may fail or produce undesired results.
@@ -1793,6 +1790,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
.headerpad_size = options.headerpad_size,
.headerpad_max_install_names = options.headerpad_max_install_names,
.dead_strip_dylibs = options.dead_strip_dylibs,
+ .force_undefined_symbols = .{},
});
errdefer bin_file.destroy();
comp.* = .{
@@ -1943,6 +1941,10 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
for (mingw.always_link_libs) |name| {
try comp.bin_file.options.system_libs.put(comp.gpa, name, .{});
}
+
+ // LLD might drop some symbols as unused during LTO and GCing, therefore,
+ // we force mark them for resolution here.
+ try comp.bin_file.options.force_undefined_symbols.put(comp.gpa, "_tls_index", {});
}
// Generate Windows import libs.
if (target.os.tag == .windows) {
src/link.zig
@@ -175,6 +175,12 @@ pub const Options = struct {
lib_dirs: []const []const u8,
rpath_list: []const []const u8,
+ /// List of symbols forced as undefined in the symbol table
+ /// thus forcing their resolution by the linker.
+ /// Corresponds to `-u <symbol>` for ELF and `/include:<symbol>` for COFF/PE.
+ /// TODO add handling for MachO.
+ force_undefined_symbols: std.StringArrayHashMapUnmanaged(void),
+
version: ?std.builtin.Version,
compatibility_version: ?std.builtin.Version,
libc_installation: ?*const LibCInstallation,
src/mingw.zig
@@ -93,12 +93,6 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
"-D_WIN32_WINNT=0x0f00",
"-D__MSVCRT_VERSION__=0x700",
});
- if (std.mem.eql(u8, dep, "tlssup.c") and comp.bin_file.options.lto) {
- // LLD will incorrectly drop the `_tls_index` symbol. Here we work
- // around it by not using LTO for this one file.
- // https://github.com/ziglang/zig/issues/8531
- try args.append("-fno-lto");
- }
c_source_files[i] = .{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", "mingw", "crt", dep,