什么是GNU链接器中的部分链接?

问题描述:

我能找到的最好的解释是从官方文档:什么是GNU链接器中的部分链接?

-r --relocateable生成重定位输出 - 即,生成输出文件,可以反过来作为输入到ld。这通常称为 部分链接。作为副作用,在支持标准Unix幻数的环境中,该选项还会将输出文件的 幻数设置为OMAGIC。如果未指定此选项,则会生成绝对 文件。当链接C++程序时,该选项不会解析对构造函数的引用;要做到这一点,请使用-Ur。此选项 与`-i'的功能相同。

我特别感兴趣的是知道链接器输入中出现的符号会发生什么。当我有一个静态库libstatic.a,其中包含一个单一的目标文件component.o。 现在,我想创建另一个静态库libfinal.a它将作为接口工作到libstatic.a。我用这个命令来创建它:

ld -r -o libfinal.a wrapper.o -L. -lstatic

wrapper.o提供专属API来调用libstatic.a定义的函数

请问libfinal.a只是组合存档具有wrapper.ocomponent.o或所有可以在wrapper.o之间解析的参考component.o被解析(链接),然后放入libfinal.a

Edit_1:更新基于所取得的进展的问题: 的objdump的组件库libstatic.aobjdump -D libstatic.a)的显示.text部分分别为每个功能(如预期)。而在已通过部分链接(-r标志)创建的组合库libfinal.a中,只有一个.text部分。我想这意味着一个内部链接已经发生,它不仅仅是创建一个普通的档案。

ld创建可执行文件和共享库,而不是目标文件档案(.a文件)。

ar创建并修改目标文件归档。当你想解决.so的某些(未解决)符号,并产生另一个.so


-r, --relocateable选项很有用。

+2

好像'-r'标志也可以用于部分链接。请在问题中查看我的** Edit_1 **。至于验证,我可以将使用'-r'标志创建的最终库链接到我的应用程序。 – govind 2015-04-06 11:50:05