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]

Re: libstdc++ libtool lossage


On Feb 25, 2002, Mark Mitchell <mark@codesourcery.com> wrote:

>> Hmm...  How about using concat, then, to avoid the trouble of
>> computing the biggest length in advance?

> Yes, good idea.

> +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.

> You're not supposed to end a sentence with "in".

Oh?  I know the rule, but for some reason I had never though of this
`in' as a preposition.  Interesting...

> This patch is fine; thanks for working it through!

Thanks, here's what I'm checking in:

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/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 */
  
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/25 13:21:40
@@ -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 they will not always be linked with the shared @file{libgcc}.
+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

-- 
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

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