Hi Iain > On 4 Oct 2021, at 17:00, Iain Buclaw via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: > > Hi, > > This patch adds handling of `-static-libstc++' to the gdc driver, so > that libstdc++ is appropriately linked if it is either needed or seen on > the command-line. > > This is required for bootstrapping the self hosted D front-end, so will > also be backported to all supported releases. > > Bootstrapped and regression tested, and committed to mainline. > > Regards > Iain. > > --- > PR d/102574 > > gcc/d/ChangeLog: > > * d-spec.cc (lang_specific_driver): Link libstdc++ statically if > -static-libstdc++ was given on command-line. > --- > gcc/d/d-spec.cc | 43 ++++++++++++++++++++++++++++++++++--------- > 1 file changed, 34 insertions(+), 9 deletions(-) > > diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc > index 16ff1539e9f..5adc662c6f2 100644 > --- a/gcc/d/d-spec.cc > +++ b/gcc/d/d-spec.cc > @@ -83,6 +83,9 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > /* "-lstdc++" if it appears on the command line. */ > const cl_decoded_option *saw_libcxx = 0; > > + /* True if we saw `-static-libstdc++'. */ > + bool saw_static_libcxx = false; > + > /* Whether we need the C++ STD library. */ > bool need_stdcxx = false; > > @@ -248,6 +251,11 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > shared_libgcc = false; > break; > > + case OPT_static_libstdc__: > + saw_static_libcxx = true; > + args[i] |= SKIPOPT; > + break; > + > case OPT_static_libphobos: > if (phobos_library != PHOBOS_NOLINK) > phobos_library = PHOBOS_STATIC; > @@ -452,16 +460,33 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > #endif > } > > - if (saw_libcxx) > - new_decoded_options[j++] = *saw_libcxx; > - else if (need_stdcxx) > + if (saw_libcxx || need_stdcxx) > { > - generate_option (OPT_l, > - (saw_profile_flag > - ? LIBSTDCXX_PROFILE > - : LIBSTDCXX), > - 1, CL_DRIVER, &new_decoded_options[j++]); > - added_libraries++; > +#ifdef HAVE_LD_STATIC_DYNAMIC > + if (saw_static_libcxx && !static_link) > + { > + generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER, > + &new_decoded_options[j++]); > + }
For targets that don’t support HAVE_LD_STATIC_DYNAMIC it would be useful to push the option back out, so that they can use that to substitute a static version of the library using %:replace-outfile(-lxxxxx libxxxxx+.a%s) [ see darwin.h for examples. ] .. I suppose we could figure out a follow-on patch and test that on Darwin? so #else … code to push the -libstdc++ out (yes, we do have this problem also with the g++ driver… I posted a patch eons ago .. but suspect it was never applied) Iain > +#endif > + if (saw_libcxx) > + new_decoded_options[j++] = *saw_libcxx; > + else if (need_stdcxx) > + { > + generate_option (OPT_l, > + (saw_profile_flag > + ? LIBSTDCXX_PROFILE > + : LIBSTDCXX), > + 1, CL_DRIVER, &new_decoded_options[j++]); > + added_libraries++; > + } > +#ifdef HAVE_LD_STATIC_DYNAMIC > + if (saw_static_libcxx && !static_link) > + { > + generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER, > + &new_decoded_options[j++]); > + } > +#endif > } > > if (shared_libgcc && !static_link) > -- > 2.30.2 >