Hi,

On Tue, 19 Feb 2013, Stephan Bergmann wrote:

> I'm puzzled by the following on Linux, where I don't understand what causes it
> that a given symbol is exported as "u" (when viewed with nm, which documents
> "u" as "a unique global symbol. This is a GNU extension...") or not:
> 
> * On an older toolchain (SLED 11 with GCC 4.3.4 and binutils 2.21.1), we have
> 
> > $ nm -D /usr/lib64/libstdc++.so.6.0.16 | grep empty_rep_storage
> > 00000000002f7660 u
> > _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
> > 00000000002f7580 B _ZNSs4_Rep20_S_empty_rep_storageE

This shared lib actually comes from the gcc46 toolchain, which does 
support unique symbols (4.3 does not).  That one symbol is unique and the 
other isn't seems to be a bug in our link editor.  The object files still 
contain unique definitions:

% nm .libs/*.o | grep empty_rep_storage
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
0000000000000000 u _ZNSs4_Rep20_S_empty_rep_storageE
                 U _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
                 U _ZNSs4_Rep20_S_empty_rep_storageE
0000000000000000 u _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE

But then, when linking those together one remains unique, and the other is 
transformed into a normal object.  The difference between both symbols is 
that for one (_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE) 
the definition comes last in the input .o files (in wstring-inst.o) 
without following references (they all come before the def), while 
for the other (_ZNSs4_Rep20_S_empty_rep_storageE) the definition (in 
string-inst.o) is followed by another reference (from wlocale-inst.o).

I.e. it looks like as if a following reference once the link editor saw 
the definition of the symbol resets it's unique status.  I can make both 
symbols wrong/non-unique by placing wlocale-inst.o last in the linker 
cmdline.

Bad :-/


Ciao,
Michael.

Reply via email to