是否可以执行差分链接?

时间:2017-02-15 09:17:20

标签: c++ gcc linker clang differential-execution

我有一个二进制文件,它使用大量具有许多相互依赖性的目标文件进行链接。每当我重新编译其中一个时,我需要链接整个二进制文件。

链接器(特别是GCC或Clang的链接器)支持某种“差分链接”方法,其中保留了关于所有其他链接部分之间的相互关系的足够信息,因此需要进行的唯一工作在重新编译单个部分时完成它与其他部分的关系+将它们放在二进制文件中吗?

注意:我最感兴趣的是C ++,但我想这个问题至少可以概括为C,也可能是其他编译语言。

1 个答案:

答案 0 :(得分:1)

在MSVC中,这称为“增量链接”。有趣的是,我发现GCC可能在某种程度上支持这一点,尝试使用“-Wl,-i”或“-Wl,-r”参数到GCC(实际上也应该由CLang支持,因为这些“{ {1}}“参数只传递给-Wl)。

我之前从未使用过它,但我使用以下makefile完成了这项工作:

ld

这构建了应用程序,但我不完全确定它在内部的作用,如果它真的像MSVC中的“增量链接”一样。

特别是,当使用“-Wl,-i”时,参数“-nostdlib”是必需的,因此默认的libs不会传递给ld(然后找不到它们 - 没有它我没有错误“OBJS := a.o b.o c.o main.o all: test_app test_app: test_app.reloc g++ -o $@ $^ # build a "relocatable" object for incremental linking (either -i or -r) test_app.reloc: $(OBJS) g++ -Wl,-i -nostdlib -nostartfiles -o $@ $^ $(OBJS): makefile %.o: %.cpp g++ -c -o $@ $< ”)。

另一个版本可能实际上工作得更好(不确定,这需要在更大的应用程序上进行测试,以查看单个对象更新的链接时间是否有所增加):

/usr/bin/ld: cannot find -lgcc_s
  • 基本上为每个对象创建可重定位文件(可能是obj文件到可执行文件链接的重要部分),然后只更新必要的可重定位项。对于使用可重定位项将所有内容链接在一起的最终链接步骤(但之前已经完成了部分链接)。

也可以创建目标文件的“组”,以便在一个可重定位的文件中进行分组,这样最终会有更少的目标文件(不确定是否会在最后带来任何东西)。