www.digitalmars.com         C & C++   DMDScript  

D.gnu - Why shared-libgcc ?

reply =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se> writes:
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Q: Why does GDC add "-shared-libgcc"
to the default command-line options ?


I can understand why e.g. C++ does it,
since it's needed for the exceptions.
But does D really utilize "libgcc_s" ?

All I know is that the D binaries end
up with a "libgcc_s.so.1" dependancy
that I need to take care of at run-time...


I thought it would better to change the
default to -static-libgcc, and then one
can add -shared-libgcc - if it is needed ?

(calling g++ to link instead of gcc, will
add -shared-libgcc automatically I think ?)
But now the normal D programs use "-lgcc".


I'm putting libgcc_s.so next to libstdc++.so...

The static libgcc only added like 16-20K,
to a sample "hello.d" hello world program.

It still links dynamically to the other libs:
 libm.so.6 => /lib/tls/libm.so.6 (0x00b54000)
 libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00279000)
 libc.so.6 => /lib/tls/libc.so.6 (0x00692000)
 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x0058a000)

--anders PS. Attaching the patch to change default.
Dec 17 2004
parent reply David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> writes:
GDC uses the same exception mechanism as G++.  If GDC is used to make 
shared libraries that use exceptions, the shared libgcc is needed (on 
some platforms.)  I know D shared libraries aren't completely supported 
now, but...

It is possible to build GCC so that it doesn't use a shared libgcc by 
using the --enable-shared or --disable-shared options with configure. 
Apple must be doing something like this for MacOS X because there is no 
libgcc_s.

David

Anders F Björklund wrote:
 Q: Why does GDC add "-shared-libgcc"
 to the default command-line options ?
 
 
 I can understand why e.g. C++ does it,
 since it's needed for the exceptions.
 But does D really utilize "libgcc_s" ?
 
 All I know is that the D binaries end
 up with a "libgcc_s.so.1" dependancy
 that I need to take care of at run-time...
 
 
 I thought it would better to change the
 default to -static-libgcc, and then one
 can add -shared-libgcc - if it is needed ?
 
 (calling g++ to link instead of gcc, will
 add -shared-libgcc automatically I think ?)
 But now the normal D programs use "-lgcc".
 
 
 I'm putting libgcc_s.so next to libstdc++.so...
 
 The static libgcc only added like 16-20K,
 to a sample "hello.d" hello world program.
 
 It still links dynamically to the other libs:
 
 libm.so.6 => /lib/tls/libm.so.6 (0x00b54000)
 libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00279000)
 libc.so.6 => /lib/tls/libc.so.6 (0x00692000)
 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x0058a000)

--anders PS. Attaching the patch to change default. ------------------------------------------------------------------------ diff -ur d.orig/d-spec.c d/d-spec.c --- d.orig/d-spec.c 2004-10-02 19:19:31.000000000 +0200 +++ d/d-spec.c 2004-12-17 11:54:05.000000000 +0100 -121,7 +121,7 int need_math = (MATH_LIBRARY[0] != '\0'); /* True if we should add -shared-libgcc to the command-line. */ - int shared_libgcc = 1; + int shared_libgcc = 0; /* The total number of arguments with the new stuff. */ int argc;

Dec 18 2004
parent reply =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se> writes:
David Friedman wrote:

 Q: Why does GDC add "-shared-libgcc"
 to the default command-line options ?

 I can understand why e.g. C++ does it,
 since it's needed for the exceptions.
 But does D really utilize "libgcc_s" ?

GDC uses the same exception mechanism as G++. If GDC is used to make shared libraries that use exceptions, the shared libgcc is needed (on some platforms.) I know D shared libraries aren't completely supported now, but... It is possible to build GCC so that it doesn't use a shared libgcc by using the --enable-shared or --disable-shared options with configure. Apple must be doing something like this for MacOS X because there is no libgcc_s.

The -static-libgcc works just fine to override the default setting of dynamic, I was just curious as to why it was dynamic by default... (also means I need to remove that patch, and include libgcc_s.so again) Mac OS X is a little "weird", since it also uses a static libstdc++.a, in addition to /usr/lib/libgcc.a for the GCC compiler library itself. (Like you say, there is no support for a shared libgcc on Mac OS X.) The system GCC 3.3 compiler has ENABLE_SHARED_LIBGCC undefined, even. http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/Link-Options.html Contrastingly, you can't build any totally static binaries either... http://developer.apple.com/qa/qa2001/qa1118.html This means that neither -static nor -shared flags are supported (as Mac OS X uses the -dynamic flag, to build .dylib libraries) The question about the shared libgcc was actually for Linux, wondered if I needed to make libgcc version 3.x a requirement for all binaries compiled by GDC. Looks like that I do... ? It's only a problem for old systems, with GCC 2 as system compiler. (I believe that GDC should be able to use the libgcc_s.so from e.g. GCC 3.3.2, since they have the same so-version: /lib/libgcc_s.so.1 ?) Wonder if C++ exceptions from shared libraries really work on Mac OS X ? And if they do, what dirty tricks they resorted to... :-) --anders
Dec 18 2004
parent David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> writes:
Anders F Björklund wrote:
 David Friedman wrote:
 
 Q: Why does GDC add "-shared-libgcc"
 to the default command-line options ?

 I can understand why e.g. C++ does it,
 since it's needed for the exceptions.
 But does D really utilize "libgcc_s" ?

GDC uses the same exception mechanism as G++. If GDC is used to make shared libraries that use exceptions, the shared libgcc is needed (on some platforms.) I know D shared libraries aren't completely supported now, but... It is possible to build GCC so that it doesn't use a shared libgcc by using the --enable-shared or --disable-shared options with configure. Apple must be doing something like this for MacOS X because there is no libgcc_s.

The -static-libgcc works just fine to override the default setting of dynamic, I was just curious as to why it was dynamic by default... (also means I need to remove that patch, and include libgcc_s.so again) Mac OS X is a little "weird", since it also uses a static libstdc++.a, in addition to /usr/lib/libgcc.a for the GCC compiler library itself. (Like you say, there is no support for a shared libgcc on Mac OS X.) The system GCC 3.3 compiler has ENABLE_SHARED_LIBGCC undefined, even. http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/g c/Link-Options.html Contrastingly, you can't build any totally static binaries either... http://developer.apple.com/qa/qa2001/qa1118.html This means that neither -static nor -shared flags are supported (as Mac OS X uses the -dynamic flag, to build .dylib libraries) The question about the shared libgcc was actually for Linux, wondered if I needed to make libgcc version 3.x a requirement for all binaries compiled by GDC. Looks like that I do... ?

Yes. Phobos requires a 3.x libgcc for the stack unwinder.
 It's only a problem for old systems, with GCC 2 as system compiler.
 (I believe that GDC should be able to use the libgcc_s.so from e.g.
 GCC 3.3.2, since they have the same so-version: /lib/libgcc_s.so.1 ?)
 
 
 Wonder if C++ exceptions from shared libraries really work on
 Mac OS X ? And if they do, what dirty tricks they resorted to... :-)
 
 --anders

I think the important bits were moved into libSystem and the dynamic loader... It's probably better that since there are less runtime dependencies. David
Dec 18 2004