| VERS_1.0 { |
| local: |
| _Znwm; # operator new(unsigned long); |
| _ZnwmRKSt9nothrow_t; # operator new(unsigned long, std::nothrow_t const&); |
| _ZdlPv; # operator delete(void*); |
| _ZdlPvRKSt9nothrow_t; # operator delete(void*, std::nothrow_t const&); |
| _Znam; # operator new[](unsigned long); |
| _ZnamRKSt9nothrow_t; # operator new[](unsigned long, std::nothrow_t const&); |
| _ZdaPv; # operator delete[](void*); |
| _ZdaPvRKSt9nothrow_t; # operator delete[](void*, std::nothrow_t const&); |
| |
| extern "C++" { |
| # |
| # Hide everything in std namespace (C++ STL symbols): |
| # |
| # This fixes several intermittent crashes that were happening in the |
| # deep_learning module in different forms on different platforms, due to |
| # tensorflow calling madlib's instantiation of STL template functions, |
| # which circumvents the hiding of madlib's global new and delete symbols |
| # (intended to override the libstdc++ version of these symbols for all |
| # of libmadlib.so, but not for anything outside of it). |
| # |
| # The main crash we looked at was due to the use of std::set<string> in |
| # madlib/src/modules/linalg/metric.cpp. Tensorflow is a python library, |
| # but it loads Google's C++ protobuf library _message.so. The crash was |
| # happening because _message.so also uses std::set<string> for some |
| # things, and it ends up calling madlib's instantiation of them. We were |
| # able to fix it by hiding all madlib symbols associated with the std::set<string |
| # class, but this just resulted in a similar crash happening instead because of a |
| # different STL symbol exposed by madlib. |
| # |
| # In the long term, we should move to hiding all symbols by default |
| # and explicitly make exceptions for madlib API functions. But this would |
| # be a bigger change and require more extensive testing to make sure it |
| # doesn't cause any obscure issues on any platform. So for now we are just |
| # hiding those in namespace std. |
| # |
| std::*; |
| boost::*; |
| }; |
| }; |