Restore exclusion of "gcc_eh" from implicit link libraries
Since !800 (merged) we no longer filter out all gcc*
implicit link libraries. This allows mixing of gcc and non-gcc compilers across languages. However, this caused a subtle problem with how GCC makes exception handling symbols available to linked binaries.
GCC (at least on MinGW) provides two different libraries with exception handling symbols:
- gcc_s: A shared library with -fvisibility=default, used by -shared-libgcc.
- gcc_eh: A static library with -fvisibility=hidden, used by -static-libgcc.
The C compiler (on MinGW) defaults to -static-libgcc and uses gcc_eh. The C++ compiler defaults to -shared-libgcc and uses gcc_s when linking shared libraries and executables so that exceptions can propagate across shared libraries. When linking a mixed-language binary, the C++ compiler should be used along with its choice of gcc_s. In this case gcc_eh should not be added even though the C compiler implies it because gcc_s supersedes it.
Since the above-mentioned change, CMake is adding gcc_eh to C++ link lines that also contain C code on MinGW. This causes both gcc_s and gcc_eh to be used, which is incorrect. We can fix this simply by excluding gcc_eh from the C compiler's implicit link libraries.
Fixes: #17436 (closed)