Package: gcc-3.2
Version: 1:3.2.3-0pre9
Severity: normal

The attached test program, when compiled with

        make CXX=g++-2.95
        
produces this output:

        creating test2.o
        creating test1.o
        starting

but when compiled with

        make CXX=g++-3.2
        
produces this output:

        creating test1.o
        creating test1.o
        starting

This is because C++ anonymous namespaces (namespaces created without names,
ie. namespace { ... };) are actually exported from object files using weak
symbols, and only one of the symbols is actually linked into the final
program.  The weak symbols have funny auto-generated names that are intended
to avoid name conflicts between object files, but the name-generation scheme
used in gcc 3.2 is based on the *source* filename, which might be the same
for two different object files.  In my example, the makefile does this:

        g++-3.2 -c -o test1.o -DTEST='"test1.o"' testx.cc
        g++-3.2 -c -o test2.o -DTEST='"test2.o"' testx.cc

This makes the compiler output different for the two object files, although
the symbol names end up being the same (as you can see with 'nm -D
test1.o').

Note that:

 - gcc-2.95 (debian 2.95.4-0.01042) does *not* exhibit this problem; it
   seems to use a random number for its random namespace symbol names.
   
 - there is probably no reason to make the symbols from that namespace
   anything other than file-local anyway.  Anonymous namespaces are
   explicitly not expected to be accessible from any other object.
   
Source code follows.

Have fun,

Avery



-- System Information
Debian Release: testing/unstable
Architecture: i386
Kernel: Linux insight 2.4.19 #1 mer sep 4 10:52:04 EDT 2002 i686
Locale: LANG=fr_CA, LC_CTYPE=fr_CA

Versions of packages gcc-3.2 depends on:
ii  binutils                2.13.90.0.18-1.7 The GNU assembler, linker and bina
ii  cpp-3.2                 1:3.2.3-0pre9    The GNU C preprocessor
ii  gcc-3.2-base            1:3.2.3-0pre9    The GNU Compiler Collection (base 
ii  libc6                   2.3.2.ds1-10     GNU C Library: Shared libraries an
ii  libgcc1                 1:3.3-2          GCC support library


>>>>>>>>>>>>>>>>>>>>>>>> Makefile >>>>>>>>>>>>>>>>>


main: main.o test1.o test2.o
        $(CXX) -o main $^

test%.o: testx.cc
        $(CXX) -c -o $@ -DTEST='"$@"' $^

clean:
        rm -f *.o *~ *.so main


>>>>>>>>>>>>>>>>>>>>>>>> main.cc >>>>>>>>>>>>>>>>>>>>>>

#include <stdio.h>

int main()
{
        printf("starting\n");
        return 0;
}


>>>>>>>>>>>>>>>>>>>>>>>> testx.cc >>>>>>>>>>>>>>>>>>>>>>>

#include <stdio.h>

namespace {
        struct Blah {
                Blah() { printf("creating %s\n", TEST); }
        };

        static Blah blah;
};



>>>>>>>>>>>>>>>>>>>>>> END >>>>>>>>>>>>>>>>>>>>




Reply via email to