GCC has two runtime libraries: The static library libgcc.a (-lgcc) and the shared library libgcc_s.so (-lgcc_s). Both implement many of the same functions but they also each have their unique functions. When gcc links programs and libraries there are three possibilities: 1. gcc -static-libgcc or gcc -static: -lgcc => Just use libgcc.a. 2. gcc -shared-libgcc: -lgcc_s -lgcc => Link with libgcc_s first, so libgcc.a is only used for its unique functions. 3. gcc: -lgcc -Wl,--as-needed -lgcc_s -Wl,--no-as-needed => Link with libgcc.a first so libgcc_s is only used for its unique functions (_Unwind_* functions). Approach 3 is the default for gcc and it's also what clang and clang++ use; approach 2 is the default for gfortran, g++ and probably other front ends. This patch makes 3 the default for gfortran. It significantly reduces the use of libgcc_s. The _Unwind_* functions are also available in the old base system libgcc_s which means this reduces the need for -rpath /usr/local/lib/gccN in ports that depend on libraries built with gfortran. Consider a dependency tree like this: prog -> libA -> libgcc_s (old base system libgcc_s is fine) -> libB -> libgcc_s (libB built with gfortran, needs new libgcc_s) Here prog needs to be linked with -rpath /usr/local/lib/gccN even if it's a normal C program compiled with clang. Without -rpath it will fail to start because it loads old libgcc_s first as a dependency of libA and then it fails to load libB. With this patch libB works with old base system libgcc_s or may not need libgcc_s at all, so prog does not need to be linked with -rpath. Upstream is unlikely accept a patch like this because libgfortran calls some _Unwind_* functions and so always needs libgcc_s. Also because every Fortran program and library links to libgfortran it makes sense that option 2 above is the default. On FreeBSD where clang and GCC compiled code can be mixed and where multiple libgcc_s may be installed, option 3 is just a lot easier to deal with. The bug that sparked this is PR 208120 (but note there's a lot of misleading information in that bug. CMake is not actually doing anything wrong.) --- UTC --- gcc/fortran/gfortranspec.cc.orig 2022-01-23 22:32:06.000000000 +0000 +++ gcc/fortran/gfortranspec.cc 2022-02-06 08:56:31.018286000 +0000 @@ -406,7 +406,7 @@ } } -#ifdef ENABLE_SHARED_LIBGCC +#if 0 if (library) { unsigned int i; --- libgfortran/Makefile.in.orig +++ libgfortran/Makefile.in @@ -759,7 +759,7 @@ $(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \ $(HWCAP_LDFLAGS) \ $(LIBM) $(extra_darwin_ldflags_libgfortran) \ - $(version_arg) -Wc,-shared-libgcc + $(version_arg) libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP) cafexeclib_LTLIBRARIES = libcaf_single.la