Package: g++
Version: 1:2.95.3-7
Severity: normal

Hi,

I just found out that some of the symbols pulled in from libgcc.a have odd
behaviour.  If I write a simple program (foo.cc) like this:

        int main()
        {
                int *x = new int;
                return 0;
        }
        
And compile like this:

        $ g++ -fno-exceptions -fno-rtti -c foo.cc
        
And then link in two different ways:

        $ g++ -s -o fooplus foo.o
        $ gcc -s -o foo     foo.o
        
I get very different files:

        $ ls -l foo fooplus
        -rwxrwxr-x    1 apenwarr apenwarr    28524 nov  7 18:20 foo*
        -rwxrwxr-x    1 apenwarr apenwarr     3368 nov  7 18:20 fooplus
        
        $ ldd foo fooplus
        foo:
                libc.so.6 => /lib/libc.so.6
                /lib/ld-linux.so.2 => /lib/ld-linux.so.2
        fooplus:
                libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3
                libm.so.6 => /lib/libm.so.6
                libc.so.6 => /lib/libc.so.6
                /lib/ld-linux.so.2 => /lib/ld-linux.so.2

Okay, so why is fooplus smaller?  The ld -Map option for the non-c++ foo
binary tells us this:

        Archive member included       because of file (symbol)

        /usr/lib/gcc-lib/i386-linux/2.95.4/libgcc.a(opnew.o)
                                      foo.o (__builtin_new)
        /usr/lib/gcc-lib/i386-linux/2.95.4/libgcc.a(_eh.o)
        
        /usr/lib/gcc-lib/i386-linux/2.95.4/libgcc.a(opnew.o) (__throw)
        [...etc...]

Now, these files _aren't_ brought into fooplus, because fooplus is linked
with libstdc++.  This reveals two potential problems:

 - libstdc++ is linking with and then re-exporting libgcc.a symbols.  My
   understanding of libgcc.a is that it can change completely from one
   version of gcc to the next, so these symbols might be completely invalid
   for code generated by a different version of gcc.  Thus, libstdc++ may
   become arbitrarily incompatible with code generated by a different
   compiler.  If this is okay, then libgcc.a might as well be in a
   libgcc.so, and we can link that when linking with gcc instead of g++;
   if this is _not_ okay, we need to fix it so these symbols don't get
   re-exported.
   
 - libgcc.a was compiled with exception handling and rtti information, 
   which makes the new and delete implementations much more complicated
   and is the main reason the code bloats so much when they're linked in.
   Since I compiled with -fno-rtti and -fno-exceptions, I'm trying to
   avoid that bloat.  (In this case, it's for an embedded system where I
   want neither exceptions, rtti, or STL, so I _have_ to link using gcc.)
   
Note that the first problem is unaffected by -fno-rtti and -fno-exceptions.

Unfortunately, I can't offer a good solution to these problems.  Perhaps
someone upstream will know.  I was just getting frustrated that the minimal
dynamically-linked C++ program on my system is 28k (and it gets bigger again
if I actually call 'delete'...)

Have fun,

Avery


-- System Information
Debian Release: testing/unstable
Kernel Version: Linux insight 2.4.9 #1 Thu Nov 1 23:29:21 EST 2001 i686 unknown

Versions of the packages g++ depends on:
ii  cpp            2.95.3-7       The GNU C preprocessor.
ii  g++-2.95       2.95.4-0.01042 The GNU C++ compiler.
ii  gcc-2.95       2.95.4-0.01042 The GNU C compiler.
ii  libstdc++2.10- 2.95.4-0.01042 The GNU stdc++ library (development files)
ii  libstdc++2.10- 2.95.4-0.01082 The GNU stdc++ library


Reply via email to