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

标签 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 选项相同,它似乎只是结合了所有目标文件也合并到一个大目标文件中。不幸的是,这似乎不是我想要的。

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

编辑:我用 -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 实用程序轻松操作。

否则,您将不得不查看不同的链接器或编译器套件。不过,我不能保证您会找到此功能,它看起来很奇特。

关于linux - 在 Linux 上使用 gcc 进行增量链接。可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249401/

相关文章:

linux - VPS服务器Web权限Ubuntu Linux设置

c++ - 在 C++ 中使用 system();不起作用

c++ - 学习编写低级驱动程序 (Linux)。

javascript - Node 中的Linux系统变量

c++ - 转换持有多态类型的模板时的未定义行为

C api同时兼容32位和64位整数

c - 从代码中断程序中删除 printf 语句

c - 将部分注入(inject) GNU ld 脚本; binutils 版本之间的脚本兼容性。

c - 如何在 C 中查看 Linux 内存映射信息?

c - Unresolved 弱函数的 GCC 行为