4

我使用地址清理器来清理我的应用程序,它与 SOCI 链接。但是与 Oracle 一起使用时会提示 followijg 错误消息。

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

这是应用程序的构建输出

/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
4

1 回答 1

5

这是GCC PR 64234。在某些时候我什至可以修复它)

您可以改用动态运行时(即 remove -static-libasan)吗?另一个选项是添加-lsoci_oracle.dLDFLAGS这将通知 GCC 导出必要的符号)。或者您可以添加一个非常愚蠢的解决方法:强制引用您的代码中缺少的符号:

extern "C" void __asan_unregister_globals();
extern "C" void __asan_register_globals();
__attribute__((used)) void *force_missing_symbols[] = {
  (void *)__asan_unregister_globals,
  (void *)__asan_register_globals
};

(您需要对所有缺失的符号执行此操作)。

于 2017-10-11T09:27:54.803 回答