| author | |
| committer | |
| log | 909159ad8ea9203297c0b670446381c537554525 |
| tree | 9b10daf0618c3fad1488622e0b9e996e5d8d3ccc |
| parent | 20fae334acb79dd367e74a3b90af5fa1445364cd |
| signature |
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 | 255 | .Exe => true, |
| 256 | 256 | }; |
| 257 | 257 | |
| 258 | if (target_util.cannotDynamicLink(target)) { | |
| 258 | if (!target_util.canDynamicLink(target)) { | |
| 259 | 259 | if (options.link_mode == .dynamic) return error.TargetCannotDynamicLink; |
| 260 | 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 | 178 | return error.PieRequiresPic; |
| 179 | 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 | 182 | if (options.inherited.pic == false) |
| 183 | 183 | return error.DynamicLinkingRequiresPic; |
| 184 | 184 | break :b true; |
src/Sema.zig+9-1| ... | ... | @@ -9180,7 +9180,15 @@ pub fn handleExternLibName( |
| 9180 | 9180 | ); |
| 9181 | 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 | 9192 | return sema.fail( |
| 9185 | 9193 | block, |
| 9186 | 9194 | src_loc, |
src/target.zig+28-5| ... | ... | @@ -10,10 +10,24 @@ const Feature = @import("Zcu.zig").Feature; |
| 10 | 10 | |
| 11 | 11 | pub const default_stack_protector_buffer_size = 4; |
| 12 | 12 | |
| 13 | pub fn cannotDynamicLink(target: *const std.Target) bool { | |
| 14 | return switch (target.os.tag) { | |
| 15 | .freestanding, .uefi => true, | |
| 16 | else => target.cpu.arch.isSpirV(), | |
| 13 | pub fn canDynamicLink(target: *const std.Target) bool { | |
| 14 | return switch (target.cpu.arch) { | |
| 15 | .amdgcn, | |
| 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 | } |
| 19 | 33 | |
| ... | ... | @@ -41,11 +55,20 @@ pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool { |
| 41 | 55 | /// This function returns whether non-pic code is completely invalid on the given target. |
| 42 | 56 | pub fn requiresPIC(target: *const std.Target, linking_libc: bool) bool { |
| 43 | 57 | return target.abi.isAndroid() or |
| 44 | target.os.tag == .windows or target.os.tag == .uefi or | |
| 58 | ((target.os.tag == .windows or target.os.tag == .uefi) and (target.cpu.arch == .aarch64 or target.cpu.arch == .x86_64)) or | |
| 45 | 59 | target.requiresLibC() or |
| 46 | 60 | (linking_libc and target.isGnuLibC()); |
| 47 | 61 | } |
| 48 | 62 | |
| 63 | pub 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 | ||
| 49 | 72 | pub fn picLevel(target: *const std.Target) u32 { |
| 50 | 73 | // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they |
| 51 | 74 | // support both level 1 and 2, in which case we prefer 2. |