gcc 4.5中关于链接的变化?

时间:2011-11-07 20:49:35

标签: gcc linker shared-libraries

我有一个项目可以生成一个共享库,该库与另一个共享库相链接。

当我编译并使用gcc 4.4链接它时,一切正常:

  1. 没有编译时警告或错误,
  2. 没有关联时间警告或错误
  3. ldd libmyproject.so正确报告与其他共享库的依赖关系。
  4. 当我编译并用gcc 4.5链接时,另一方面(具有完全相同的标志),我有以下症状:

    1. 没有编译时警告或错误,
    2. 没有关联时间警告或错误
    3. 库未与其他共享库正确链接:当我运行ldd并且没有看到连接时,以及当我尝试使用它时,它会自行显示:当它与gcc 4.4一起使用时,它在运行时与gcc 4.5崩溃并出现“未找到符号”错误(当然来自其他lib)。
    4. 我查看了release notes,我的直觉是它与新的链接时优化有关,但我无法理解它们。

      有没有人遇到类似情况和/或有任何建议?

      (请注意,4.6的结果外观与4.5相同。)

3 个答案:

答案 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打印大量调试,您将能够

  • 1)比较" LD_DEBUG=all ./your_program_4.4"的输出和" LD_DEBUG=all ./your_program_4.5"
  • 2)查看试图解决的最后符号并找到错误的符号。

另外,您应该向我们提供更多信息:

  • 0)您的操作系统和CPU类型是什么? (显示uname -a的输出)libc的版本是什么? (在bash中运行for a in /lib*/libc.so.*;do echo $a; $a; done
  • 1)什么是图书馆自身的标志?
  • 2)尝试运行应用程序时出现了什么错误?
  • 3)LD_DEBUG输出的最后一行可以包含有价值的信息

更新:好的和准确的答案在这里: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选项出现在目标文件之后。