我有以下问题。我有一个共享库,它只是一堆链接在一起的翻译单元,所以当我编译那个共享库时,我不会得到任何链接器错误( undefined reference ,即使我可能有)。
共享库从一个可执行文件动态加载,该可执行文件还包含我的共享库正在使用的导出(我的库中使用的引用在运行时解析)。
主要问题是我想要 undefined reference 警告,这样我就可以静态修复它们,而不是等待应用程序崩溃。
我在某处读到我可以将“-Wl,--no-undefined”传递给 gcc,这样我就可以恢复这些错误,确实有效,但它也给了我可执行文件导出的所有 undefined reference 。我想将这些警告过滤到我的翻译单元的范围内。
这可能吗?如果没有,我如何定义对具有共享库导出的可执行文件的引用。
最佳答案
您可以尝试使用 -Wl,-z,now
链接库和主程序。这应该使运行时 ldso 立即解析所有引用,如果没有找到则抛出错误。
否则,我在链接器手册中没有看到一个选项说“允许此 ELF 满足符号,但实际上不将其列为 DT_NEEDED”。
您可以尝试使用 -Wl,--no-undefined
并使用脚本解析输出,这样您就可以过滤掉您知道主程序会满足的符号。
另一种选择可能是用 __attribute__((weak))
标记你知道主程序提供的所有符号,然后仍然使用 -Wl,--no-undefined
。弱符号不会被报告为错误。
关于c++ - GCC 将共享库链接到可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367365/