libcrypto++.so is linked such that the NEEDED library list is incomplete. Reproducible: Always Steps to Reproduce: 1. ldd -r /usr/lib64/libcrypto++.so 2. Observe it has missing symbols, these are due to the NEEDED library list being incomplete. Actual Results: # ldd -r /usr/lib64/libcrypto++.so >x 2>&1 # cat x | c++filt linux-vdso.so.1 => (0x00007fff1a565000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fae0f1f1000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fae0efd4000) libc.so.6 => /lib64/libc.so.6 (0x00007fae0ec48000) /lib64/ld-linux-x86-64.so.2 (0x00007fae0fbbc000) undefined symbol: __cxa_pure_virtual (/usr/lib64/libcrypto++.so) undefined symbol: vtable for __cxxabiv1::__si_class_type_info (/usr/lib64/libcrypto++.so) undefined symbol: vtable for __cxxabiv1::__vmi_class_type_info (/usr/lib64/libcrypto++.so) undefined symbol: vtable for __cxxabiv1::__class_type_info (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for std::exception (/usr/lib64/libcrypto++.so) undefined symbol: vtable for __cxxabiv1::__pointer_type_info (/usr/lib64/libcrypto++.so) undefined symbol: vtable for __cxxabiv1::__enum_type_info (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for std::basic_ostream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for std::basic_istream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for unsigned char const* (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for std::bad_alloc (/usr/lib64/libcrypto++.so) undefined symbol: VTT for std::basic_ofstream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::basic_ios<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for char const* (/usr/lib64/libcrypto++.so) undefined symbol: VTT for std::basic_ifstream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::bad_alloc (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for unsigned int (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for bool (/usr/lib64/libcrypto++.so) undefined symbol: std::ios_base::Init::~Init() (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for int (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for wchar_t const* (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::basic_filebuf<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::basic_streambuf<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::basic_ofstream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for unsigned char* (/usr/lib64/libcrypto++.so) undefined symbol: vtable for std::basic_ifstream<char, std::char_traits<char> > (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for int const* (/usr/lib64/libcrypto++.so) undefined symbol: typeinfo for unsigned char (/usr/lib64/libcrypto++.so) undefined symbol: std::bad_alloc::~bad_alloc() (/usr/lib64/libcrypto++.so) undefined symbol: __gxx_personality_v0 (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >& std::ws<char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&) (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_free_exception (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_begin_catch (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::allocator<char> const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::reserve(unsigned long) (/usr/lib64/libcrypto++.so) undefined symbol: operator new(unsigned long) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::seekg(std::fpos<__mbstate_t>) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_leak_hard() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*, unsigned long) (/usr/lib64/libcrypto++.so) undefined symbol: std::__throw_length_error(char const*) (/usr/lib64/libcrypto++.so) undefined symbol: std::ios_base::ios_base() (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_guard_release (/usr/lib64/libcrypto++.so) undefined symbol: operator delete(void*) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::__basic_file<char>::~__basic_file() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(unsigned long, char) (/usr/lib64/libcrypto++.so) undefined symbol: std::uncaught_exception() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::read(char*, long) (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_allocate_exception (/usr/lib64/libcrypto++.so) undefined symbol: std::_List_node_base::_M_hook(std::_List_node_base*) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::tellg() (/usr/lib64/libcrypto++.so) undefined symbol: std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::replace(unsigned long, unsigned long, char const*, unsigned long) (/usr/lib64/libcrypto++.so) undefined symbol: log (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(char const*) const (/usr/lib64/libcrypto++.so) undefined symbol: std::set_new_handler(void (*)()) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf() (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_throw (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_guard_abort (/usr/lib64/libcrypto++.so) undefined symbol: std::__throw_bad_alloc() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::seekg(long, std::_Ios_Seekdir) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ostream<char, std::char_traits<char> >::flush() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_end_catch (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_guard_acquire (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::putback(char) (/usr/lib64/libcrypto++.so) undefined symbol: std::locale::~locale() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char) (/usr/lib64/libcrypto++.so) undefined symbol: std::ios_base::Init::Init() (/usr/lib64/libcrypto++.so) undefined symbol: std::ios_base::~ios_base() (/usr/lib64/libcrypto++.so) undefined symbol: __dynamic_cast (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ostream<char, std::char_traits<char> >::write(char const*, long) (/usr/lib64/libcrypto++.so) undefined symbol: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(unsigned long, char, std::allocator<char> const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::exception::~exception() (/usr/lib64/libcrypto++.so) undefined symbol: std::_Rb_tree_decrement(std::_Rb_tree_node_base*) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/usr/lib64/libcrypto++.so) undefined symbol: pow (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_filebuf<char, std::char_traits<char> >::close() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf() (/usr/lib64/libcrypto++.so) undefined symbol: __cxa_rethrow (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/usr/lib64/libcrypto++.so) undefined symbol: std::_List_node_base::_M_unhook() (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(char const*, unsigned long) (/usr/lib64/libcrypto++.so) undefined symbol: std::basic_istream<char, std::char_traits<char> >::peek() (/usr/lib64/libcrypto++.so) # Expected Results: # ldd -r /usr/lib64/libcrypto++.so linux-vdso.so.1 => (0x00007fffad984000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffaac356000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/libstdc++.so.6 (0x00007ffaac04b000) libm.so.6 => /lib64/libm.so.6 (0x00007ffaabdc9000) libc.so.6 => /lib64/libc.so.6 (0x00007ffaaba3e000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffaab828000) /lib64/ld-linux-x86-64.so.2 (0x00007ffaaccee000) # I have a fix, is it ok if I add dev-libs/crypto++/crypto++-5.6.1-r3.ebuild that applies an additional patch?
Created attachment 300331 [details, diff] patch that 1) uses libtool tag=CXX 2) adds -lpthread I'm happy to fix the bug myself, you can assign it to me if you like.
Created attachment 300333 [details, diff] crypto++-5.6.1-fix_build_system.patch All fixes in GNUmakefile should be integrated in crypto++-5.6.1-fix_build_system.patch. Then crypto++-5.6.1-sunos.patch should be deleted. I'm attaching updated version of crypto++-5.6.1-fix_build_system.patch.
Looks great, thanks!
Fixed in CVS. Thanks everyone! *crypto++-5.6.1-r3 (30 Jan 2012) 30 Jan 2012; Dane Smith <c1pher@gentoo.org> -crypto++-5.6.1-r2.ebuild, +crypto++-5.6.1-r3.ebuild, +files/crypto++-5.6.1-r3-fix_build_system.patch: Address NEEDED library issues wrt bug 401431. Thanks Arfrever for the patch. Add new patch (updated fix_build_system patch) for r3 since the current one is used by the stable -r1. The new patch includes the changes that are in the patch {P}-sunos. This should be dropped when -r3 goes stable and -r1 is dropped. Drop -r2.