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?