未定义的符号错误与-static-libasan

问题描述:

我使用地址清理器来清理我的应用程序,它与SOCI链接。但是,当与Oracle一起使用时,提示followijg错误消息。未定义的符号错误与-static-libasan

./SociUT: symbol lookup error: /home/testhome/libs/libsoci_oracle.d.so.1.4.18: undefined symbol: __asan_unregister_globals 

这里是aplication

/home/rel/GCC/asan-gcc-4.9.3/bc0232/bin/g++ -std=c++11 -g3 -static-libasan -fsanitize=address -fno-omit-frame-pointer -L/home/mt_1/4/4.7.c/build/bc0397/tech/MB/link/API/63 -L/usr/lib64 -L/usr/lib64 -L/home/janaka077/mt-git/mt-database/mt_1/database_SOCI_Core/bin -L/usr/local/boost_1_59_0/stage/lib -L/usr/local/boost_1_59_0/stage/lib -L/usr/local/gtest-1.7.0/lib/.libs -o SociUT Main.o version.o -lmb.d -lrdmacm -libverbs -lxml2 -lmsoci.d -lboost_date_time -lboost_filesystem -lboost_system -lboost_serializion -lboost_thread -lboost_chrono -lgtest -lz -lnsl -lrt -ldl -lz -lcrypt -lnuma 

的构建输出这是GCC PR 64234。在某些时候,我甚至可以修复它)

您可以使用动态运行时而不是(即删除-static-libasan)?另一个选择是将-lsoci_oracle.d添加到LDFLAGS(这将通知GCC导出必要的符号)。或者你可以添加一个非常愚蠢的解决办法,即从您的代码强制失踪符号的引用:

extern "C" void __asan_unregister_globals(void *globals, size_t n); 
void *force_missing_symbol = (void *)__asan_unregister_globals; 

(你需要的,原型可以从this header获得所有缺少符号做到这一点)。

+0

什么是LDFLAGS? – Janaka

+0

@Janaka:链接器标志。 – yugr

+0

在这种情况下,我需要让我的应用程序独立于Oracle。所以这对我来说不是很好的解决方案。 – Janaka