diff options
author | Ian Lance Taylor <iant@google.com> | 2009-06-25 19:17:07 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2009-06-25 19:17:07 +0000 |
commit | 96be7a11070fd121d25f14c8fcc206c98ed63942 (patch) | |
tree | 9df30fa0de0c0a4779b8bf43637a65d6ccac3e32 | |
parent | 0dae2d924dac1c080e85b92b1f71031dc67f606a (diff) | |
download | gcc-96be7a11070fd121d25f14c8fcc206c98ed63942.zip gcc-96be7a11070fd121d25f14c8fcc206c98ed63942.tar.gz gcc-96be7a11070fd121d25f14c8fcc206c98ed63942.tar.bz2 |
g++spec.c (SKIPOPT): define.
cp/:
* g++spec.c (SKIPOPT): define.
(lang_specific_driver): Handle -static-libstdc++. Only add
LIBSTDCXX_STATIC if we add LIBSTDCXX.
./: * doc/invoke.texi (Option Summary): Mention -static-libstdc++.
(Link Options): Document -static-libstdc++.
From-SVN: r148951
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/g++spec.c | 59 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 15 |
4 files changed, 70 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7225a1f..3ed6355 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-06-25 Ian Lance Taylor <iant@google.com> + + * doc/invoke.texi (Option Summary): Mention -static-libstdc++. + (Link Options): Document -static-libstdc++. + 2009-06-25 Andrew Pinski <andrew_pinski@playstation.sony.com> PR target/38731 @@ -757,7 +762,7 @@ 32 bits. * config/arm/arm.md: Likewise. -2009-06-19 Ian Lance Taylor <ian@airs.com> +2009-06-19 Ian Lance Taylor <iant@google.com> * tree-cfg.c (gimple_redirect_edge_and_branch): Change ERROR_MARK to GIMPLE_ERROR_MARK. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e651c1d..dcb35e6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2009-06-25 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. + +2009-06-25 Ian Lance Taylor <iant@google.com> + * cvt.c (convert_to_void): Only warn about COND_EXPR if neither the second nor third operand has side effects. diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c index f49d699..ab50f57 100644 --- a/gcc/cp/g++spec.c +++ b/gcc/cp/g++spec.c @@ -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. If not see #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" @@ -60,10 +62,11 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, /* If nonzero, the user gave us the `-v' flag. */ int saw_verbose_flag = 0; - /* This is a tristate: + /* What do with libstdc++: -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, const char *const **in_argv, /* 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, const char *const **in_argv, 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, const char *const **in_argv, /* 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, const char *const **in_argv, arglist[j] = "-xnone"; } + if ((args[i] & SKIPOPT) != 0) + --j; + i++; j++; } @@ -319,18 +334,32 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, /* 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, const char *const **in_argv, } if (saw_libc) arglist[j++] = saw_libc; - if (shared_libgcc) + if (shared_libgcc && !static_link) arglist[j++] = "-shared-libgcc"; arglist[j] = NULL; diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 1078ce5..244441a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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}} @@ -8246,6 +8247,18 @@ for the languages used in the program, or using the option @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 |