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

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