@@ -129,6 +129,7 @@ pub const ResolveError = error{
129129 LldCannotIncrementallyLink ,
130130 LtoRequiresLld ,
131131 SanitizeThreadRequiresLibCpp ,
132+ LibCRequiresLibUnwind ,
132133 LibCppRequiresLibUnwind ,
133134 OsRequiresLibC ,
134135 LibCppRequiresLibC ,
@@ -312,8 +313,8 @@ pub fn resolve(options: Options) ResolveError!Config {
312313 break :b false ;
313314 };
314315
315- const link_libunwind = b : {
316- if (link_libcpp and target_util .libcNeedsLibUnwind (target )) {
316+ var link_libunwind = b : {
317+ if (link_libcpp and target_util .libCxxNeedsLibUnwind (target )) {
317318 if (options .link_libunwind == false ) return error .LibCppRequiresLibUnwind ;
318319 break :b true ;
319320 }
@@ -352,7 +353,7 @@ pub fn resolve(options: Options) ResolveError!Config {
352353 break :b .static ;
353354 }
354355 if (explicitly_exe_or_dyn_lib and link_libc and
355- (target . isGnuLibC ( ) or target_util . osRequiresLibC (target )))
356+ (target_util . osRequiresLibC ( target ) or (target . isGnuLibC () and ! options . resolved_target . is_native_abi )))
356357 {
357358 if (options .link_mode == .static ) return error .LibCRequiresDynamicLinking ;
358359 break :b .dynamic ;
@@ -367,18 +368,25 @@ pub fn resolve(options: Options) ResolveError!Config {
367368
368369 if (options .link_mode ) | link_mode | break :b link_mode ;
369370
370- if (explicitly_exe_or_dyn_lib and link_libc and
371- options . resolved_target . is_native_abi and target .abi . isMusl ( ))
371+ if (explicitly_exe_or_dyn_lib and link_libc and options . resolved_target . is_native_abi and
372+ ( target . isGnuLibC () or target .isMuslLibC () ))
372373 {
373374 // If targeting the system's native ABI and the system's libc is
374- // musl, link dynamically by default.
375+ // glibc or musl, link dynamically by default.
375376 break :b .dynamic ;
376377 }
377378
378379 // Static is generally a better default. Fight me.
379380 break :b .static ;
380381 };
381382
383+ // This is done here to avoid excessive duplicated logic due to the complex dependencies between these options.
384+ if (options .output_mode == .Exe and link_libc and target_util .libCNeedsLibUnwind (target , link_mode )) {
385+ if (options .link_libunwind == false ) return error .LibCRequiresLibUnwind ;
386+
387+ link_libunwind = true ;
388+ }
389+
382390 const import_memory = options .import_memory orelse (options .output_mode == .Obj );
383391 const export_memory = b : {
384392 if (link_mode == .dynamic ) {
0 commit comments