我有一个关于使用其中一个GCC链接器选项的问题:-Wl, - defsym。
前段时间我决定用C ++重写我的一个项目,但没有使用它的标准库,甚至没有链接到它(我使用C ++编译器将.cpp源文件编译成目标文件,但我使用C编译器链接它们)。
为此,我使用了以下编译器标志:
-fno-exceptions -fno-rtti -nostdlib -nodefaultlibs
以下链接器选项:
-Wl,--defsym -Wl,__cxa_pure_virtual=0
使用这些标志我得到了我的共享库编译和链接。 但是在我尝试在一些简单的程序中使用我的共享库(也使用上面的标志编译和链接)后,我在运行时遇到以下错误:
examples/bin/blink: symbol lookup error: examples/bin/libblink.so: undefined symbol: __cxa_pure_virtual
其中blink是可执行文件的名称,libblink.so是我的共享库的名称。
我试图修复它,它看起来像用这个函数替换--Wl, - defsym链接器标志(对于可执行文件和库):
extern "C" void __cxa_pure_virtual
{
while (true);
}
完成这项工作。为什么--Wl, - defsym在这种情况下不起作用? 我还想提一下,我在Windows下对它进行了测试,它在那里工作正常。
答案 0 :(得分:0)
我认为我已经找到了问题的答案。
将符号地址从0更改为任何其他值可修复我的问题。 所以没有:
--Wl,--defsym --Wl,__cxa_pure_virtual=0
我有:
--Wl,--defsym --Wl,__cxa_pure_virtual=1
这样运行时链接程序不会查找符号(我认为当地址设置为0时就是这种情况)。