This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH RFA: Add -static-libstdc++ option to g++


It is sometimes useful to link statically against libstdc++ without
doing a full static link.  In particular, when building gcc with C++,
I think this is what we want to do.  We do not want to worry about
ensuring that gcc is able to find the right version of libstdc++ when
gcc itself is run.

This patch adds a -static-libstdc++ option to the g++ driver.  This is
conceptually similar to the static-libgfortran option supported by the
gfortran driver.

I suppose this patch requires approval from the C++ frontend
maintainers.  And/or, perhaps, the libstdc++ maintainers or the build
system maintainers.  I'm not sure where this falls.

David, I adjusted your LIBSTDCXX_STATIC patch slightly: it now only
adds LIBSTDCXX_STATIC if it adds LIBSTDCXX.  That seemed to me to be
the desired behaviour.  Please let me know if this breaks anything.

Bootstrapped and ran C++ testsuite on x86_64-unknown-linux-gnu.  OK
for mainline.

Ian


gcc/ChangeLog:

2009-06-19  Ian Lance Taylor  <iant@google.com>

	* doc/invoke.texi (Option Summary): Mention -static-libstdc++.
	(Link Options): Document -static-libstdc++.

gcc/cp/ChangeLog:

2009-06-19  Ian Lance Taylor  <iant@google.com>

	* g++spec.c (SKIPOPT): define.
	(lang_specific_driver): Handle -static-libstdc++.  Only add
	LIBSTDCXX_STATIC if we add LIBSTDCXX.


Index: cp/g++spec.c
===================================================================
--- cp/g++spec.c	(revision 148727)
+++ cp/g++spec.c	(working copy)
@@ -1,6 +1,6 @@
 /* Specific flags and argument handling of the C++ front end.
    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2007, 2008  Free Software Foundation, Inc.
+   2007, 2008, 2009 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3.  
 #define MATHLIB		(1<<2)
 /* This bit is set if they did `-lc'.  */
 #define WITHLIBC	(1<<3)
+/* Skip this option.  */
+#define SKIPOPT		(1<<4)
 
 #ifndef MATH_LIBRARY
 #define MATH_LIBRARY "-lm"
@@ -63,7 +65,8 @@ lang_specific_driver (int *in_argc, cons
   /* This is a tristate:
      -1 means we should not link in libstdc++
      0  means we should link in libstdc++ if it is needed
-     1  means libstdc++ is needed and should be linked in.  */
+     1  means libstdc++ is needed and should be linked in.
+     2  means libstdc++ is needed and should be linked statically.  */
   int library = 0;
 
   /* The number of arguments being added to what's in argv, other than
@@ -96,6 +99,9 @@ lang_specific_driver (int *in_argc, cons
   /* By default, we throw on the math library if we have one.  */
   int need_math = (MATH_LIBRARY[0] != '\0');
 
+  /* True if we saw -static.  */
+  int static_link = 0;
+
   /* True if we should add -shared-libgcc to the command-line.  */
   int shared_libgcc = 1;
 
@@ -200,9 +206,15 @@ lang_specific_driver (int *in_argc, cons
 		 cause a warning.  */
 	      library = -1;
 	    }
-	  else if (strcmp (argv[i], "-static-libgcc") == 0
-		   || strcmp (argv[i], "-static") == 0)
+	  else if (strcmp (argv[i], "-static") == 0)
+	    static_link = 1;
+	  else if (strcmp (argv[i], "-static-libgcc") == 0)
 	    shared_libgcc = 0;
+	  else if (strcmp (argv[i], "-static-libstdc++") == 0)
+	    {
+	      library = library >= 0 ? 2 : library;
+	      args[i] |= SKIPOPT;
+	    }
 	  else if (DEFAULT_WORD_SWITCH_TAKES_ARG (&argv[i][1]))
 	    i++;
 	  else
@@ -261,7 +273,7 @@ lang_specific_driver (int *in_argc, cons
 
   /* Make sure to have room for the trailing NULL argument.
      Add one for shared_libgcc or extra static library.  */
-  num_args = argc + added + need_math + (library > 0) + 2;
+  num_args = argc + added + need_math + (library > 0) * 4 + 1;
   arglist = XNEWVEC (const char *, num_args);
 
   i = 0;
@@ -312,6 +324,9 @@ lang_specific_driver (int *in_argc, cons
 	  arglist[j] = "-xnone";
 	}
 
+      if ((args[i] & SKIPOPT) != 0)
+	--j;
+
       i++;
       j++;
     }
@@ -319,18 +334,32 @@ lang_specific_driver (int *in_argc, cons
   /* Add `-lstdc++' if we haven't already done so.  */
   if (library > 0)
     {
+#ifdef HAVE_LD_STATIC_DYNAMIC
+      if (library > 1 && !static_link)
+	{
+	  arglist[j] = "-Wl,-Bstatic";
+	  j++;
+	}
+#endif
       arglist[j] = saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX;
       if (arglist[j][0] != '-' || arglist[j][1] == 'l')
 	added_libraries++;
       j++;
-    }
-  /* Add target-dependent static library, if necessary.  */
-  if (shared_libgcc == 0 && LIBSTDCXX_STATIC != NULL)
-    {
-      arglist[j] = LIBSTDCXX_STATIC;
-      if (arglist[j][0] != '-' || arglist[j][1] == 'l')
-	added_libraries++;
-      j++;
+      /* Add target-dependent static library, if necessary.  */
+      if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL)
+	{
+	  arglist[j] = LIBSTDCXX_STATIC;
+	  if (arglist[j][0] != '-' || arglist[j][1] == 'l')
+	    added_libraries++;
+	  j++;
+	}
+#ifdef HAVE_LD_STATIC_DYNAMIC
+      if (library > 1 && !static_link)
+	{
+	  arglist[j] = "-Wl,-Bdynamic";
+	  j++;
+	}
+#endif
     }
   if (saw_math)
     arglist[j++] = saw_math;
@@ -343,7 +372,7 @@ lang_specific_driver (int *in_argc, cons
     }
   if (saw_libc)
     arglist[j++] = saw_libc;
-  if (shared_libgcc)
+  if (shared_libgcc && !static_link)
     arglist[j++] = "-shared-libgcc";
 
   arglist[j] = NULL;
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi	(revision 148727)
+++ doc/invoke.texi	(working copy)
@@ -409,7 +409,8 @@ Objective-C and Objective-C++ Dialects}.
 @xref{Link Options,,Options for Linking}.
 @gccoptlist{@var{object-file-name}  -l@var{library} @gol
 -nostartfiles  -nodefaultlibs  -nostdlib -pie -rdynamic @gol
--s  -static  -static-libgcc  -shared  -shared-libgcc  -symbolic @gol
+-s  -static  -static-libgcc  -static-libstdc++ -shared  @gol
+-shared-libgcc  -symbolic @gol
 -T @var{script}  -Wl,@var{option}  -Xlinker @var{option} @gol
 -u @var{symbol}}
 
@@ -8240,6 +8241,18 @@ for the languages used in the program, o
 @option{-shared-libgcc}, such that it is linked with the shared
 @file{libgcc}.
 
+@item -static-libstdc++
+When the @command{g++} program is used to link a C++ program, it will
+normally automatically link against @option{libstdc++}.  If
+@file{libstdc++} is available as a shared library, and the
+@option{-static} option is not used, then this will link against the
+shared version of @file{libstdc++}.  That is normally fine.  However, it
+is sometimes useful to freeze the version of @file{libstdc++} used by
+the program without going all the way to a fully static link.  The
+@option{-static-libstdc++} option directs the @command{g++} driver to
+link @file{libstdc++} statically, without necessarily linking other
+libraries statically.
+
 @item -symbolic
 @opindex symbolic
 Bind references to global symbols when building a shared object.  Warn

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]