This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: libstdc++ libtool lossage
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: Mark Mitchell <mark at codesourcery dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: 24 Feb 2002 23:37:28 -0300
- Subject: Re: libstdc++ libtool lossage
- Organization: GCC Team, Red Hat
- References: <135340000.1014598677@warlock.codesourcery.com>
On Feb 24, 2002, Mark Mitchell <mark@codesourcery.com> wrote:
> I think the technical content of the patch is fine, but you're right
> -- I don't like the formatting. I see why you did it, but I think
> this would be better:
> char *buffer = (char *) malloc(/* Calculate biggest line length. */);
> sprintf(buffer, "%%{!shared-libgcc...", shared_name);
> obstack_grow(obstack, buffer, ...);
> sprintf(buffer, " {...}");
Hmm... How about using concat, then, to avoid the trouble of
computing the biggest length in advance?
I made a simplification too: without LINK_EH_SPEC, -shared without
-static-libgcc may just link with shared_name, regardless of
-shared-libgcc. This is what I ended up with. Ok to install?
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* gcc.c (init_gcc_specs): Get -shared-libgcc along with -shared to
link with shared_name only.
* doc/invoke.texi (Link Options): Document new behavior.
Index: gcc/doc/invoke.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/invoke.texi,v
retrieving revision 1.118
diff -u -p -r1.118 invoke.texi
--- gcc/doc/invoke.texi 2002/02/23 17:10:30 1.118
+++ gcc/doc/invoke.texi 2002/02/24 20:00:59
@@ -4428,15 +4428,26 @@ of these is when the application wishes
across different shared libraries. In that case, each of the libraries
as well as the application itself should use the shared @file{libgcc}.
-Therefore, whenever you specify the @option{-shared} option, the GCC
-driver automatically adds @option{-shared-libgcc}, unless you explicitly
-specify @option{-static-libgcc}. The G++ driver automatically adds
-@option{-shared-libgcc} when you build a main executable as well because
-for C++ programs that is typically the right thing to do.
-(Exception-handling will not work reliably otherwise.)
+Therefore, the G++ and GCJ drivers automatically add
+@option{-shared-libgcc} whenever you build a shared library or a main
+executable, because C++ and Java programs typically use exceptions, so
+this is the right thing to do.
-However, when linking a main executable written in C, you must
-explicitly say @option{-shared-libgcc} if you want to use the shared
+If, instead, you use the GCC driver to create shared libraries, you may
+find that the shared version of @file{libgcc} is not always linked in.
+If GCC finds, at its configuration time, that you have a GNU linker that
+does not support option @option{--eh-frame-hdr}, it will link the shared
+version of @file{libgcc} into shared libraries by default. Otherwise,
+it will take advantage of the linker and optimize away the linking with
+the shared version of @file{libgcc}, linking with the static version of
+libgcc by default. This allows exceptions to propagate through such
+shared libraries, without incurring relocation costs at library load
+time.
+
+However, if a library or main executable is supposed to throw or catch
+exceptions, you must link it using the G++ or GCJ driver, as appropriate
+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 -symbolic
Index: gcc/gcc.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/gcc.c,v
retrieving revision 1.295
diff -u -p -c -r1.295 gcc.c
*** gcc/gcc.c 2002/02/23 05:59:47 1.295
--- gcc/gcc.c 2002/02/25 02:30:29
*************** init_gcc_specs (obstack, shared_name, st
*** 1414,1444 ****
const char *static_name;
const char *eh_name;
{
! char buffer[128];
! const char *p;
! /* If we see -shared-libgcc, then use the shared version. */
! sprintf (buffer, "%%{shared-libgcc:%s %s}", shared_name, static_name);
! obstack_grow (obstack, buffer, strlen (buffer));
! /* If we see -static-libgcc, then use the static version. */
! sprintf (buffer, "%%{static-libgcc:%s %s}", static_name, eh_name);
! obstack_grow (obstack, buffer, strlen (buffer));
! /* Otherwise, if we see -shared, then use the shared version
! if using EH registration routines or static version without
! exception handling routines otherwise. */
! p = "%{!shared-libgcc:%{!static-libgcc:%{shared:";
! obstack_grow (obstack, p, strlen (p));
#ifdef LINK_EH_SPEC
! sprintf (buffer, "%s}}}", static_name);
#else
! sprintf (buffer, "%s}}}", shared_name);
#endif
! obstack_grow (obstack, buffer, strlen (buffer));
! /* Otherwise, use the static version. */
! sprintf (buffer,
! "%%{!shared-libgcc:%%{!static-libgcc:%%{!shared:%s %s}}}",
! static_name, eh_name);
! obstack_grow (obstack, buffer, strlen (buffer));
}
#endif /* ENABLE_SHARED_LIBGCC */
--- 1414,1436 ----
const char *static_name;
const char *eh_name;
{
! char *buf;
! buf = concat ("%{!shared:%{!shared-libgcc:", static_name, " ",
! eh_name, "}%{shared-libgcc:", shared_name, " ",
! static_name, "}}",
! "%{shared:%{static-libgcc:", static_name, " ",
! eh_name, "}%{!static-libgcc:",
#ifdef LINK_EH_SPEC
! "%{shared-libgcc:", shared_name,
! "}%{!shared-libgcc:", static_name, "}",
#else
! shared_name,
#endif
! "}}", NULL);
!
! obstack_grow (obstack, buf, strlen (buf));
! free (buf);
}
#endif /* ENABLE_SHARED_LIBGCC */
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist Professional serial bug killer