]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: gdc driver ignores -static-libstdc++ when automatically linking libstdc++ library
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 3 Oct 2021 14:02:24 +0000 (16:02 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Mon, 4 Oct 2021 15:07:30 +0000 (17:07 +0200)
Adds handling of `-static-libstc++' in the gdc driver, so that libstdc++
is appropriately linked if libstdc++ is either needed or seen on the
command-line.

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

index 16ff1539e9f5e64e8cde7a98797754f272405144..5adc662c6f2509ce75507c3c704c38989773206a 100644 (file)
@@ -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++]);
+       }
+#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)