【问题标题】:Symbol lookup error when using -Wl,--defsym GCC option使用 -Wl,--defsym GCC 选项时出现符号查找错误
【发布时间】:2016-03-11 19:55:12
【问题描述】:

我有一个关于使用 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 下对此进行了测试,并且在那里运行良好。

【问题讨论】:

  • 用 C++ 重写我的一个项目,但没有使用它的标准库,甚至没有链接到它到底为什么?标准库赋予了 C++ 力量!
  • 不喜欢他的程序链接到 C++ 标准库的原因有很多。其中之一是嵌入式设备的空间限制。
  • 我不明白的是:你用过虚函数调用吗?如果没有运行时支持,它应该如何工作?
  • 我确实使用了虚函数调用,当然它们可以在没有“运行时支持”的情况下工作。虚函数调用只是取消引用 vtable 指针,因此 c++ std lib 不需要做任何事情。此外,我从 C 更改为 C++ 只是为了 oop(我厌倦了在 C 中编写类似 oop 的代码),我不想为此牺牲二进制大小。
  • 编译器没有链接。没有 GNU C 链接器。

标签: c++ gcc linker g++


【解决方案1】:

我想我已经找到了问题的答案。

将符号地址从 0 更改为任何其他值可以解决我的问题。 所以不要有:

--Wl,--defsym --Wl,__cxa_pure_virtual=0

我有:

--Wl,--defsym --Wl,__cxa_pure_virtual=1

这种方式运行时链接器不会寻找符号(我认为是地址设置为 0 时的情况)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多