我一直在跟踪我的程序启动时触发的错误。这是gdb提供的回溯:
(gdb) bt
#0 0xb753f571 in llvm::cl::parser<llvm::FunctionPass* (*)()>::getOption(unsigned int) const ()
from ./libgdl.so
#1 0xb79aeab4 in llvm::cl::generic_parser_base::findOption(char const*) ()
from ./libgdl.so
#2 0xb753f679 in llvm::RegisterPassParser<llvm::RegisterRegAlloc>::NotifyRemove(char const*) ()
from ./libgdl.so
#3 0xaf35f0b6 in llvm::MachinePassRegistry::Add(llvm::MachinePassRegistryNode*) () from /usr/lib
/i386-linux-gnu/libLLVM-3.1.so.1
#4 0xaef42b16 in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.1.so.1
#5 0xb7fece9b in ?? () from /lib/ld-linux.so.2
事实上,崩溃是由于系统使用 LLVM 3.1(用于图形相关任务),而我使用的是嵌入在我的程序 (libgdl.so) 中的 LLVM 3.0:
当 libLLVM-3.1.so.1 想要调用NotifyRemove 函数,调用被转发到我在 libgdl.so 中的 LLVM 版本,并且由于版本不兼容而导致崩溃。
有什么办法可以防止这样的混乱吗?