在linux上使用gcc进行增量链接。可能吗?

时间:2010-11-22 19:28:59

标签: linux gcc ld object-files incremental-linking

我的团队项目的开发方式,我们从所有.o个目标文件为我们的应用程序生成一个共享对象库。我的任务(希望它足够具体,但也足够通用以供其他人使用!)是仅链接自上次创建可执行文件以来已更改的目标文件。例如,这是我用来构建.so:

的命令行
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

哪个按预期工作! :)我的目标是从现在开始只能链接更改的目标文件,以加快并发链接过程。示例命令是:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

哪个会使用较新的目标文件更新libMySharedLibrary.so,同时还会在libMySharedLibrary.so中维护旧的目标文件。实际上,当我使用上面的命令生成libMySharedLibrary.so时,文件大小比包含所有目标文件的文件大小要小得多,所以我几乎可以确定上面的命令没有做我想要的

通过我的研究,我发现链接器有一个-i选项,与-r选项相同,它似乎只是将所有目标文件合并为一个大对象文件同样。不幸的是,这似乎不是我想要的。

简而言之,我想在初始链接之后仅链接更改的目标文件,从而为将来的链接提供更快的链接过程。有没有办法做到这一点?

编辑:我用-i/-r尝试过的一个例子:

示例命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

我必须添加-nostdlib标记,以阻止它向我大吼大叫需要它,并删除-shared,因为-r标记不允许共享对象。

这个命令似乎将我的所有.o文件都压缩成一个大的.o文件。所以,如果我只能从改变的.o文件那里更新那个.o文件,那就太好了。在最初创建AllMyObjects.o之后,我尝试了这个命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o,但它也会创建一个更小的(文件大小)AllMyObjects.o,所以我假设它不可能拥有所有的目标文件。我觉得这是我可能犯了一个小错误的东西。有人有什么建议吗?提前谢谢。

2 个答案:

答案 0 :(得分:6)

您似乎对-shared-r没有合作是正确的。我对你的旧GCC版本持怀疑态度,但即使在Ubuntu 10.10上我也能看到相同的内容:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

不幸的是,如果你绝对需要共享对象,这意味着你已经达到了死胡同。 binutils链接器根本不实现它。

如果静态库是您的选项,它们只是可以使用ar实用程序轻松操作的归档。

否则,您将不得不查看不同的链接器或编译器套件。我不能保证你会发现这个功能,但它看起来很奇特。

答案 1 :(得分:4)

您可以获得使用归档/静态库之后的行为,但初始链接仍将花费相同的时间。

使用存档文件:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

正如我所说,实际链接.so所需的时间仍然与之前相同。