Hi,

This came up in a User question last night and reminded me that I had a patch 
for it in my Q.

----

Usually g++ driver support for -static-libstdc++ is provided by "-Bstatic 
-lstdc++ -Bdynamic" and is currently disabled for targets without that linker 
support.  However, actually, there is still an opportunity for those targets to 
implement the functionality with a spec substituation like:

%{static-libstdc++:%:replace-outfile(-lstdc++ libstdc++.a%s)}

However, this doesn't currently work because the g++ driver swallows 
"-static-libstdc++" so it's never seen by the specs.
The patch below pushes -static-libstdc++ onto the output command line (for 
targets without -Bstatic/dynamic)  so that such specs have an opportunity to 
fire.

OK for trunk?
Iain

gcc/cp:
        * g++spec.c (lang_specific_driver): Push "-static-libstdc++" back to 
the output
        command line when the target linker does not support -Bstatic/dynamic 
so that it
        is available for spec substitions to act on.


---
gcc/cp/g++spec.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
index 6536d7e..48a9708 100644
--- a/gcc/cp/g++spec.c
+++ b/gcc/cp/g++spec.c
@@ -363,6 +363,15 @@ lang_specific_driver (struct cl_decoded_option 
**in_decoded_options,
                           &new_decoded_options[j]);
          j++;
        }
+#else
+      /* For linkers that don't support Bstatic/dynamic push the flag back
+         so that spec substitution can see it.  */
+      if (library > 1 && !static_link)
+        {
+          generate_option (OPT_static_libstdc__, NULL, 0, CL_DRIVER,
+                           &new_decoded_options[j]);
+          j++;
+        }
#endif
    }
  if (saw_math)
-- 
2.2.1

Reply via email to