This fixes a long-standing problem on Darwin where we cannot independently set -static-libstdc++ because the flag gets stripped by the g++ driver.
This patch is essentially the same as the one used for the 'D' driver and has been in local use for some time. It has also been tested on Linux. OK for master? backports? thanks Iain -- >8 -- The current implementation for swapping between the static and shared c++ runtimes relies on the static linker supporting Bstatic/dynamic which is not available for every target (Darwin's linker does not support this). Specs substitution (%s) is an alternative solution for this (which is what Darwin uses for Fortran, D and Objective-C). However, specs substitution requires that the '-static-libstdc++' be preserved in the driver's command line. The patch here arranges for this to be done when the configuration determines that linker support for Bstatic/dynamic is missing. Signed-off-by: Iain Sandoe <i...@sandoe.co.uk> gcc/cp/ChangeLog: * g++spec.cc (lang_specific_driver): Preserve -static-libstdc++ in the driver command line for targets without -Bstatic/dynamic support in their static linker. --- gcc/cp/g++spec.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gcc/cp/g++spec.cc b/gcc/cp/g++spec.cc index 3d3b042dd56..f95d7965355 100644 --- a/gcc/cp/g++spec.cc +++ b/gcc/cp/g++spec.cc @@ -234,7 +234,12 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, case OPT_static_libstdc__: library = library >= 0 ? 2 : library; +#ifdef HAVE_LD_STATIC_DYNAMIC + /* Remove -static-libstdc++ from the command only if target supports + LD_STATIC_DYNAMIC. When not supported, it is left in so that a + back-end target can use outfile substitution. */ args[i] |= SKIPOPT; +#endif break; case OPT_stdlib_: -- 2.37.1 (Apple Git-137.1)