我有一个项目可以生成一个共享库,该库与另一个共享库相链接。
当我编译并使用gcc 4.4链接它时,一切正常:
ldd libmyproject.so
正确报告与其他共享库的依赖关系。当我编译并用gcc 4.5链接时,另一方面(具有完全相同的标志),我有以下症状:
ldd
并且没有看到连接时,以及当我尝试使用它时,它会自行显示:当它与gcc 4.4一起使用时,它在运行时与gcc 4.5崩溃并出现“未找到符号”错误(当然来自其他lib)。我查看了release notes,我的直觉是它与新的链接时优化有关,但我无法理解它们。
有没有人遇到类似情况和/或有任何建议?
(请注意,4.6的结果外观与4.5相同。)
答案 0 :(得分:2)
您可以使用LD_DEBUG环境变量调试动态链接的应用程序。这是ld-linux.so.2
的选项; ldd也是一个设置这种选项的脚本。所有选项均在http://linux.die.net/man/8/ld-linux手册页中进行了描述。
如何使用LD_DEBUG(以bash方式;最简单的方法):
$ LD_DEBUG=all ./your_program
这将打开ld-linux.so.2的调试 - 运行时动态链接器。它将向stdout或stderr打印大量调试,您将能够
LD_DEBUG=all ./your_program_4.4
"的输出和" LD_DEBUG=all ./your_program_4.5
" 另外,您应该向我们提供更多信息:
uname -a
的输出)libc的版本是什么? (在bash中运行for a in /lib*/libc.so.*;do echo $a; $a; done
)更新:好的和准确的答案在这里:GCC 4.5 vs 4.4 linking with dependencies(由Mat)
答案 1 :(得分:2)
总结Mat来自GCC 4.5 vs 4.4 linking with dependencies的回答以及评论中的讨论,您需要链接:
--copy-dt-needed-entries and --no-as-needed
答案 2 :(得分:1)
确保在链接器命令行上的对象(或源)文件之后指定共享库。
这是过去使用静态库的方式。最近版本的GCC似乎再次受益。据我所知,如果它扫描一个不提供任何有用符号的共享库,它会忽略整个库,这会优化运行时加载的共享库的数量,但要求-libname
选项出现在目标文件之后。