3

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

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

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

4

3 回答 3

1

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

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

这里有两种思路:

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

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

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

希望这会有所帮助并给您提示

于 2009-12-10T14:44:16.773 回答
1

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

于 2009-12-10T14:46:32.997 回答
1

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

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

于 2010-01-20T07:18:22.527 回答