Hi, I'm using cryptopp 5.6.1 on OSX and statically link it to *both* main app and a framework it links to (for different purposes). Both binaries use -fvisibility=hidden and -fvisibility-inlines-hidden ( http://gcc.gnu.org/wiki/Visibility) on GCC 4.2 and cryptopp is built normally with the makefile.
Everything is fine until the point where I use some random number generator in my framework and die horribly by std::terminate. This is the exception it prints: NameValuePairs: type mismatch for 'RandomNumberGeneratorPointer', stored 'PN8CryptoPP21RandomNumberGeneratorE', trying to retrieve 'PN8CryptoPP21RandomNumberGeneratorE' Looks like I'm hitting the typeinfo problem across shared object boundaries: http://gcc.gnu.org/faq.html#dso We managed to build cryptopp as a dylib framework of its own, but that didn't help much: same crash, same stack but different modules involved (before it was framework/app/crash, now it is framework/cryptopp.framework/crash). I suspect some templates are instantiated in both binaries and confuse each other on runtime. Is this a supported scenario at all? I looked around for a define I can use to make it magically go away, but best solution so far is to modify NameValuePairs type comparison function to compare strings instead of using operator== (that's what happens when built with MS compiler anyway...). Did anybody encounter that? I don't want to rename cryptopp namespace and have 2 copies of the lib... (because this kind of stuff never stops at 2...) Here is the actual crash. Notice how the whole chain happens in *framework*and GetRequiredParameter is called from out of *app.* 6 libc++abi.dylib 0x94cf3268 std::terminate() + 23 7 libc++abi.dylib 0x94cf42a0 __cxa_throw + 112 8 *app* 0x00d38d2b CryptoPP::NameValuePairs::ThrowIfTypeMismatch(char const*, std::type_info const&, std::type_info const&) + 155 (cryptlib.h:291) 9 *framework* 0x04dd0149 CryptoPP::AlgorithmParametersTemplate<CryptoPP::RandomNumberGenerator*>::AssignValue(char const*, std::type_info const&, void*) const + 109 10 *framework* 0x04de9359 CryptoPP::AlgorithmParametersBase::GetVoidValue(char const*, std::type_info const&, void*) const + 457 11 *framework* 0x04de9326 CryptoPP::AlgorithmParametersBase::GetVoidValue(char const*, std::type_info const&, void*) const + 406 12 *framework* 0x04de940f CryptoPP::AlgorithmParameters::GetVoidValue(char const*, std::type_info const&, void*) const + 47 13 *app* 0x00d7b30a void CryptoPP::NameValuePairs::GetRequiredParameter<CryptoPP::RandomNumberGenerator*>(char const*, char const*, CryptoPP::RandomNumberGenerator*&) const + 58 (cryptlib.h:296) 14 *framework* 0x04e60148 CryptoPP::RandomNumberStore::StoreInitialize(CryptoPP::NameValuePairs const&) + 56 15 *framework* 0x04db61ae CryptoPP::Source::SourceInitialize(bool, CryptoPP::NameValuePairs const&) + 34 16 *framework* 0x04dcfd6d CryptoPP::RandomNumberSource::RandomNumberSource(CryptoPP::RandomNumberGenerator&, int, bool, CryptoPP::BufferedTransformation*) + 167 Thanks -- You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [email protected]. More information about Crypto++ and this group is available at http://www.cryptopp.com.
