Linux ppc64 - compatibility-ldbl.o can't find std::num_put

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm using gcc 5.3.0 on Linux ppc64 and I built binutils 2.25.1 and gcc
 with the same configuration options into the same directory.

Configuration options were --disable-multilib --enable-languages=c,c++

I seem to be hitting
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43968 except that bug was
closed as invalid because it was really binutils.  I'm using a newer
binutils 2.25.1 and I don't have the gnu-unique-object symbol types in
the archive as in that bug.  But, like that bug, I have
compatibility-lbdl.o in there, it seems.

/opt/act-gcc-5.3.0/lib/gcc/powerpc64-unknown-linux-gnu/5.3.0/../../../../lib64/libstdc++.a(compatibility-ldbl.o):
In function `std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const':
/root/gcc/act-gcc-5.3.0-sandbox/build-gcc/powerpc64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h:2510:
undefined reference to `std::ostreambuf_iterator<char,
std::char_traits<char> > std::num_put<char,
std::ostreambuf_iterator<char, std::char_traits<char> >
>::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const'

... and more, with just the type passed to do_put changing - unsigned
long, void const*, long long, unsigned long long - and then wchar_t
versions of the same.

These symbols are definitely in libstdc++.a in locale-inst.o and wlocale-inst.o:

$ nm -C /opt/act-gcc-5.3.0/lib64/libstdc++.a | grep -F
"std::ostreambuf_iterator<char, std::char_traits<char> >
std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> >
>::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const"
                 U std::ostreambuf_iterator<char,
std::char_traits<char> > std::num_put<char,
std::ostreambuf_iterator<char, std::char_traits<char> >
>::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const
0000000000001590 W std::ostreambuf_iterator<char,
std::char_traits<char> > std::num_put<char,
std::ostreambuf_iterator<char, std::char_traits<char> >
>::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const

The test program in the referenced bug works properly.  If I extract
locale-inst.o and wlocale-inst.o from libstdc++.a and add them to the
linker line, it is able to find the symbols and links successfully.

The only linker options I'm using besides -L and -l are
-Wl,-z,noexecstack -static-libgcc -static-libstdc++.  If I remove
-static-libstdc++ it links successfully.

The same code and g++ and ld parameters work successfully on x86 and
x86_64 machines.

I'd love something less hacky than having to pull the .o files out and
add them to the link line, any suggestions here?



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux