commit 9924897c065af526f43c82d4b8328b5e72d100bd (tree)
parent 5d019abe4ec70373db7a75c2a8a3e2d76939817c
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Mon, 25 Aug 2025 17:07:33 +0200
Merge pull request #24995 from alexrp/ubsan-rt-hidden
ubsan-rt: export symbols with hidden visibility
Diffstat:
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/lib/ubsan_rt.zig b/lib/ubsan_rt.zig
@@ -627,7 +627,7 @@ fn exportHandler(
// Work around x86_64 backend limitation.
const linkage = if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag == .windows) .internal else .weak;
const N = "__ubsan_handle_" ++ sym_name;
- @export(handler, .{ .name = N, .linkage = linkage });
+ @export(handler, .{ .name = N, .linkage = linkage, .visibility = if (linkage == .internal) .default else .hidden });
}
fn exportHandlerWithAbort(
@@ -639,11 +639,11 @@ fn exportHandlerWithAbort(
const linkage = if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag == .windows) .internal else .weak;
{
const N = "__ubsan_handle_" ++ sym_name;
- @export(handler, .{ .name = N, .linkage = linkage });
+ @export(handler, .{ .name = N, .linkage = linkage, .visibility = if (linkage == .internal) .default else .hidden });
}
{
const N = "__ubsan_handle_" ++ sym_name ++ "_abort";
- @export(abort_handler, .{ .name = N, .linkage = linkage });
+ @export(abort_handler, .{ .name = N, .linkage = linkage, .visibility = if (linkage == .internal) .default else .hidden });
}
}
diff --git a/src/Compilation.zig b/src/Compilation.zig
@@ -2048,7 +2048,14 @@ pub fn create(gpa: Allocator, arena: Allocator, diag: *CreateDiagnostic, options
break :s .none; // only LLD can handle ubsan-rt for this target
} else true,
};
- if (have_zcu and (!need_llvm or use_llvm)) break :s .zcu;
+ if (have_zcu and (!need_llvm or use_llvm)) {
+ // ubsan-rt's exports use hidden visibility. If we're building a Windows DLL and
+ // exported functions are going to be dllexported, LLVM will complain that
+ // dllexported functions must use default or protected visibility. So we can't use
+ // the ZCU strategy in this case.
+ if (options.config.dll_export_fns) break :s .lib;
+ break :s .zcu;
+ }
if (need_llvm and !build_options.have_llvm) break :s .none; // impossible to build without llvm
if (is_exe_or_dyn_lib) break :s .lib;
break :s .obj;