增量链接在Linux上使用GCC。可能吗?
-
27-09-2019 - |
题
我的团队项目的开发方式,我们为我们的所有所有的.o
目标文件的应用程序中的共享对象库。我的任务(希望这是不够具体,也足够一般要使用别人的!)是链接只有自创建可执行文件上一次已更改的目标文件。例如,这里是命令行,我使用来构建。所以:
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
,所以我假设它不可能拥有所有的目标文件。我觉得这一点是我很可能就做一个小错误。任何人有什么建议吗?由于事先。
解决方案
它看起来像你即将-shared
和-r
不是一起工作的权利。我很怀疑你的旧版本的GCC,但即使是在Ubuntu 10.10,我可以看到相同的:
$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together
不幸的是,这意味着你已经到了一个死胡同,如果你确实需要共享对象。 binutils的连接子根本不实现它。
如果静态库是一个选择,它们仅仅是可以很容易地与ar
效用操纵档案
否则,你将不得不看不同的接头或编译器套件。我不能保证你会发现这个功能,但是,它似乎充满异国情调。
其他提示
您可以排序的让你使用存档/静态库之后是行为,但最初的链接仍然会采取相同的时间量。
使用的归档文件:
# 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
像以前那样。