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

我能找到的最佳解释来自官方文件:

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

我特别想知道链接器输入中出现的符号会发生什么。 当我有一个包含单个目标文件component.o的静态库libstatic.a时,请考虑具体情况。 现在,我想创建另一个静态库libfinal.a ,它将作为libstatic.a的接口。 我用这个命令来创建它:

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

其中wrapper.o提供了独有的API来调用libstatic.a中定义的函数

libfinal.a是否只是一个包含wrapper.ocomponent.o的组合存档,或者在wrapper.ocomponent.o之间可以解析的所有引用被解析(链接)然后放入libfinal.a

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

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

ar创建和修改目标文件存档。


-r, --relocateable选项在您想要解析.so某些(未解析的)符号并生成另一个.so时非常有用。