D.gnu - Why shared-libgcc ?
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (20/24) Dec 17 2004 Q: Why does GDC add "-shared-libgcc"
- David Friedman (10/64) Dec 18 2004 GDC uses the same exception mechanism as G++. If GDC is used to make
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (22/37) Dec 18 2004 The -static-libgcc works just fine to override the default setting
- David Friedman (6/60) Dec 18 2004 I think the important bits were moved into libSystem and the dynamic
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
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
David Friedman wrote: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... :-) --andersQ: 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.
Dec 18 2004
Anders F Björklund wrote:David Friedman wrote:Yes. Phobos requires a 3.x libgcc for the stack unwinder.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... ?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.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... :-) --andersI 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