authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-01-23 19:45:34+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-01-23 21:16:01+01:00
log909159ad8ea9203297c0b670446381c537554525
tree9b10daf0618c3fad1488622e0b9e996e5d8d3ccc
parent20fae334acb79dd367e74a3b90af5fa1445364cd
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

compiler: don't enforce PIC for x86-windows and thumb-windows

Only x86_64-windows and aarch64-windows actually require PIC.

4 files changed, 39 insertions(+), 8 deletions(-)

src/Compilation/Config.zig+1-1
...@@ -255,7 +255,7 @@ pub fn resolve(options: Options) ResolveError!Config {...@@ -255,7 +255,7 @@ pub fn resolve(options: Options) ResolveError!Config {
255 .Exe => true,255 .Exe => true,
256 };256 };
257257
258 if (target_util.cannotDynamicLink(target)) {258 if (!target_util.canDynamicLink(target)) {
259 if (options.link_mode == .dynamic) return error.TargetCannotDynamicLink;259 if (options.link_mode == .dynamic) return error.TargetCannotDynamicLink;
260 break :b .static;260 break :b .static;
261 }261 }
src/Package/Module.zig+1-1
...@@ -178,7 +178,7 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {...@@ -178,7 +178,7 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
178 return error.PieRequiresPic;178 return error.PieRequiresPic;
179 break :b true;179 break :b true;
180 }180 }
181 if (options.global.link_mode == .dynamic) {181 if (options.global.link_mode == .dynamic and target_util.requiresPicForDynamicLink(target)) {
182 if (options.inherited.pic == false)182 if (options.inherited.pic == false)
183 return error.DynamicLinkingRequiresPic;183 return error.DynamicLinkingRequiresPic;
184 break :b true;184 break :b true;
src/Sema.zig+9-1
...@@ -9180,7 +9180,15 @@ pub fn handleExternLibName(...@@ -9180,7 +9180,15 @@ pub fn handleExternLibName(
9180 );9180 );
9181 break :blk;9181 break :blk;
9182 }9182 }
9183 if (!target.cpu.arch.isWasm() and !block.ownerModule().pic) {9183 if (!target_util.canDynamicLink(target)) {
9184 return sema.fail(
9185 block,
9186 src_loc,
9187 "dependency on dynamic library '{s}' cannot be satisfied because target does not support dynamic linking",
9188 .{lib_name},
9189 );
9190 }
9191 if (!block.ownerModule().pic and target_util.requiresPicForDynamicLink(target)) {
9184 return sema.fail(9192 return sema.fail(
9185 block,9193 block,
9186 src_loc,9194 src_loc,
src/target.zig+28-5
...@@ -10,10 +10,24 @@ const Feature = @import("Zcu.zig").Feature;...@@ -10,10 +10,24 @@ const Feature = @import("Zcu.zig").Feature;
1010
11pub const default_stack_protector_buffer_size = 4;11pub const default_stack_protector_buffer_size = 4;
1212
13pub fn cannotDynamicLink(target: *const std.Target) bool {13pub fn canDynamicLink(target: *const std.Target) bool {
14 return switch (target.os.tag) {14 return switch (target.cpu.arch) {
15 .freestanding, .uefi => true,15 .amdgcn,
16 else => target.cpu.arch.isSpirV(),16 .bpfeb,
17 .bpfel,
18 .nvptx,
19 .nvptx64,
20 .spirv32,
21 .spirv64,
22 => false,
23 .wasm32,
24 .wasm64,
25 => true,
26 else => switch (target.os.tag) {
27 // This list is likely incomplete.
28 .freestanding, .uefi => false,
29 else => true,
30 },
17 };31 };
18}32}
1933
...@@ -41,11 +55,20 @@ pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool {...@@ -41,11 +55,20 @@ pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool {
41/// This function returns whether non-pic code is completely invalid on the given target.55/// This function returns whether non-pic code is completely invalid on the given target.
42pub fn requiresPIC(target: *const std.Target, linking_libc: bool) bool {56pub fn requiresPIC(target: *const std.Target, linking_libc: bool) bool {
43 return target.abi.isAndroid() or57 return target.abi.isAndroid() or
44 target.os.tag == .windows or target.os.tag == .uefi or58 ((target.os.tag == .windows or target.os.tag == .uefi) and (target.cpu.arch == .aarch64 or target.cpu.arch == .x86_64)) or
45 target.requiresLibC() or59 target.requiresLibC() or
46 (linking_libc and target.isGnuLibC());60 (linking_libc and target.isGnuLibC());
47}61}
4862
63pub fn requiresPicForDynamicLink(target: *const std.Target) bool {
64 assert(canDynamicLink(target));
65
66 return switch (target.os.tag) {
67 .windows => target.cpu.arch == .aarch64 or target.cpu.arch == .x86_64,
68 else => !target.cpu.arch.isWasm(),
69 };
70}
71
49pub fn picLevel(target: *const std.Target) u32 {72pub fn picLevel(target: *const std.Target) u32 {
50 // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they73 // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they
51 // support both level 1 and 2, in which case we prefer 2.74 // support both level 1 and 2, in which case we prefer 2.