Commit 44e2dbe117

Andrew Kelley <andrew@ziglang.org>
2023-12-25 04:11:58
fix logic for default entry point
when linking libc, the entry point is within libc. when producing C code, the entry point is decided when compiling the C code and does not need to be known up front. fixes a false positive "error: unknown target entry point" when using -ofmt=c.
1 parent 1edcea9
Changed files (1)
src
Compilation
src/Compilation/Config.zig
@@ -161,20 +161,6 @@ pub fn resolve(options: Options) ResolveError!Config {
         break :b options.shared_memory orelse false;
     };
 
-    const entry: ?[]const u8 = switch (options.entry) {
-        .disabled => null,
-        .default => b: {
-            if (options.output_mode != .Exe) break :b null;
-            break :b target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse
-                return error.UnknownTargetEntryPoint;
-        },
-        .enabled => target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse
-            return error.UnknownTargetEntryPoint,
-        .named => |name| name,
-    };
-    if (entry != null and options.output_mode != .Exe)
-        return error.NonExecutableEntryPoint;
-
     // *If* the LLVM backend were to be selected, should Zig use the LLVM
     // library to build the LLVM module?
     const use_lib_llvm = b: {
@@ -348,6 +334,29 @@ pub fn resolve(options: Options) ResolveError!Config {
         break :b false;
     };
 
+    const entry: ?[]const u8 = switch (options.entry) {
+        .disabled => null,
+        .default => b: {
+            if (options.output_mode != .Exe) break :b null;
+
+            // When linking libc, the entry point is inside libc and not in the
+            // zig compilation unit.
+            if (link_libc) break :b null;
+
+            // When producing C source code, the decision of entry point is made
+            // when compiling the C code, not when producing the C code.
+            if (target.ofmt == .c) break :b null;
+
+            break :b target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse
+                return error.UnknownTargetEntryPoint;
+        },
+        .enabled => target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse
+            return error.UnknownTargetEntryPoint,
+        .named => |name| name,
+    };
+    if (entry != null and options.output_mode != .Exe)
+        return error.NonExecutableEntryPoint;
+
     const any_unwind_tables = options.any_unwind_tables or
         link_libunwind or target_util.needUnwindTables(target);