链接可执行文件中缺少静态库符号

时间:2009-12-10 14:31:00

标签: static-linking

我正在尝试将静态创建的.a库与另一段C代码链接起来。

但是,在最终的可执行文件中,当使用nm命令查看时,发现缺少几个符号(函数名称)。这是因为链接器(被调用的gcc)正在剥离在与库链接的另一段C代码中未引用的符号。我想用nm命令查找的函数符号在.a库中可见。

如何使链接器不剥离以这种方式省略的符号?

3 个答案:

答案 0 :(得分:1)

通常,链接器会删除其他符号 - 主要用于

  • 减少可执行文件的最终大小
  • 加快程序的执行

这里有两列思路:

  • 当您使用选项-O作为gcc命令行的一部分时,即优化代码,因此所有调试信息都会被删除,因此链接器将自动执行相同操作。
  • 当您使用选项-g作为gcc命令行的一部分时,它包含所有调试信息,以便可以在调试器下加载可执行文件并保持符号完整。

从本质上讲,这两者是相互排斥的 - 你不能将两者结合起来。

所以这取决于您使用哪个开关来实现。通常,-g开关用于在公开发布之前进行内部调试和测试。相反的是类似-O2的东西,这使得编译器足够聪明,可以生成一个被认为是优化的可执行文件,例如删除死变量,展开循环等等。

希望这会有所帮助,并为您提供提示

答案 1 :(得分:1)

通常,您需要在应用程序中调用一些注册函数来生成此类引用。当然,如果您无权访问第一个库的代码,则只能使用tommieb75所描述的-g选项。

答案 2 :(得分:1)

使用-dynamic编译gcc以强制编译器包含所有符号。但要确保这是你真正想要的,因为这是浪费。

可能对某些静态工厂模式有用。