【问题标题】:How to quickly find the object files another object tile needs to be present at link time?如何快速找到链接时需要存在另一个对象图块的对象文件?
【发布时间】:2020-02-22 20:28:04
【问题描述】:

我已经编译了wget的源代码,这里是ftp服务器https://ftp.gnu.org/gnu/wget/,用于将我自己的程序链接到我编译项目后获得的目标文件之一。但是在所需文件上运行nm -u(具体来说是src/http.o)会给我很多需要在链接时解析的名称。

问题 #1

是否有工具可以查找需要存在哪些其他目标文件才能让链接器解析所有符号?手动测试每个可能的目标文件组合似乎都不合理。

问题 #2

当我尝试将我的程序与从编译项目获得的每个可能的目标文件链接时,我遇到以下错误 - multiple definition。这是否意味着通常我只需要在编译某个项目然后用它们构建我的可执行文件后选择我得到的目标文件的一个有意义的子集?

【问题讨论】:

  • 如果代码的维护者打算让你在他们的代码中链接,那么他们会提供一个库来链接。如果这不是他们的意图,并且您仍然想使用他们代码的特定部分,那么不幸的是,您将需要花时间了解代码中的结构和依赖关系。可能有解决此类依赖关系的工具,但最好的方法可能是在您发现缺少符号时一次添加一个对象。
  • Q1 - 工具搜索与 stackoverflow 无关。 Q2 - 没有minimal reproducible example,很难说。你必须告诉我们你是如何“链接”你的程序的,具体是什么,以什么顺序以及如何。

标签: linux compilation wget ld elf


【解决方案1】:

是否有工具可以查找需要存在哪些其他目标文件才能让链接器解析所有符号?

没有。构建这样一个工具并不难(你想在依赖图中找到连通的组件),但问题并不常见。

手动测试每个可能的目标文件组合似乎都不合理。

看起来wget 包含大约 100 个源文件。使用所有可能的排列,您只需要尝试您的链接100! 次,这确实是尝试的组合太多了。

正如@kaylum 评论的那样,开发人员并不打算将wget 用作可重用库,因此即使您尝试了所有可能的组合,也不能保证一定有解决方案。

另请注意,在wget 源中的链接会对您的最终程序施加许可限制(您必须根据 GPLv3 发布它)。

当我尝试将我的程序与从编译项目获得的每个可能的目标文件链接时,我遇到以下错误 - 多重定义。

这是预期的:您自己的程序和wget/src/main.c 都定义了main 函数。

这是否意味着通常我只需要选择一个有意义的目标文件子集,这些目标文件是在编译某个项目然后用它们构建我的可执行文件后获得的?

是的。而且一般而言无法保证满足您的要求的子集甚至存在。

【讨论】:

  • 我真的很喜欢你的回答,但是当我尝试只链接从项目根目录运行 make 后获得的目标文件时,我仍然有多重定义和未定义引用类型的错误;也许,确实,如果我检查生成的 Makefile,我会发现它们并没有完全链接,而是以某种合理的方式相互链接某些目标文件......无论如何,谢谢你的好答案,还有@kaylum让我明白了。
猜你喜欢
  • 2023-02-04
  • 2021-07-17
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多