From e26f063b22893f50dd7eb02a01585f4d52849ede Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 17 Feb 2020 15:46:53 -0500 Subject: [PATCH] support the concept of a target not having a dynamic linker --- lib/std/target.zig | 19 +++++++++++++++++-- src-self-hosted/stage2.zig | 2 ++ src/codegen.cpp | 1 + src/error.cpp | 3 ++- src/stage2.h | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/std/target.zig b/lib/std/target.zig index af8d6474ed..d3f487e9ff 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -1227,6 +1227,7 @@ pub const Target = union(enum) { ) error{ OutOfMemory, UnknownDynamicLinkerPath, + TargetHasNoDynamicLinker, }![:0]u8 { const a = allocator; if (self.isAndroid()) { @@ -1300,6 +1301,10 @@ pub const Target = union(enum) { .riscv32 => return mem.dupeZ(a, u8, "/lib/ld-linux-riscv32-ilp32.so.1"), .riscv64 => return mem.dupeZ(a, u8, "/lib/ld-linux-riscv64-lp64.so.1"), + .wasm32, + .wasm64, + => return error.TargetHasNoDynamicLinker, + .arc, .avr, .bpfel, @@ -1324,12 +1329,22 @@ pub const Target = union(enum) { .kalimba, .shave, .lanai, - .wasm32, - .wasm64, .renderscript32, .renderscript64, => return error.UnknownDynamicLinkerPath, }, + + .freestanding, + .ios, + .tvos, + .watchos, + .macosx, + .uefi, + .windows, + .emscripten, + .other, + => return error.TargetHasNoDynamicLinker, + else => return error.UnknownDynamicLinkerPath, } } diff --git a/src-self-hosted/stage2.zig b/src-self-hosted/stage2.zig index 02269a8c4f..5b918f9514 100644 --- a/src-self-hosted/stage2.zig +++ b/src-self-hosted/stage2.zig @@ -110,6 +110,7 @@ const Error = extern enum { UnsupportedArchitecture, WindowsSdkNotFound, UnknownDynamicLinkerPath, + TargetHasNoDynamicLinker, }; const FILE = std.c.FILE; @@ -1101,6 +1102,7 @@ export fn stage2_detect_dynamic_linker(in_target: *const Stage2Target, out_ptr: ) catch |err| switch (err) { error.OutOfMemory => return .OutOfMemory, error.UnknownDynamicLinkerPath => return .UnknownDynamicLinkerPath, + error.TargetHasNoDynamicLinker => return .TargetHasNoDynamicLinker, }; out_ptr.* = result.ptr; out_len.* = result.len; diff --git a/src/codegen.cpp b/src/codegen.cpp index f0640c871c..225e39989c 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8969,6 +8969,7 @@ static void detect_dynamic_linker(CodeGen *g) { char *dynamic_linker_ptr; size_t dynamic_linker_len; if ((err = stage2_detect_dynamic_linker(g->zig_target, &dynamic_linker_ptr, &dynamic_linker_len))) { + if (err == ErrorTargetHasNoDynamicLinker) return; fprintf(stderr, "Unable to detect dynamic linker: %s\n", err_str(err)); exit(1); } diff --git a/src/error.cpp b/src/error.cpp index af1359f9ee..c633e2fe67 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -80,7 +80,8 @@ const char *err_str(Error err) { case ErrorLibCKernel32LibNotFound: return "kernel32 library not found"; case ErrorUnsupportedArchitecture: return "unsupported architecture"; case ErrorWindowsSdkNotFound: return "Windows SDK not found"; - case ErrorUnknownDynamicLinkerPath: return "Windows SDK not found"; + case ErrorUnknownDynamicLinkerPath: return "unknown dynamic linker path"; + case ErrorTargetHasNoDynamicLinker: return "target has no dynamic linker"; } return "(invalid error)"; } diff --git a/src/stage2.h b/src/stage2.h index 15a66379a7..b6e4cebbaf 100644 --- a/src/stage2.h +++ b/src/stage2.h @@ -103,6 +103,7 @@ enum Error { ErrorUnsupportedArchitecture, ErrorWindowsSdkNotFound, ErrorUnknownDynamicLinkerPath, + ErrorTargetHasNoDynamicLinker, }; // ABI warning