【问题标题】:Is it possible to perform differential linking?是否可以执行差分链接?
【发布时间】:2017-07-03 20:43:06
【问题描述】:

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

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

注意:我对 C++ 最感兴趣,但我想这个问题至少可以推广到 C 并且可能推广到其他编译语言。

【问题讨论】:

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


    【解决方案1】:

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


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

    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 $@ $<
    

    这构建了应用程序,但我不完全确定它在内部做了什么,如果它真的在 MSVC 中完成了类似“增量链接”的操作。

    特别是,使用“-Wl,-i”时需要参数“-nostdlib”,这样默认库就不会传递给ld(然后找不到它们 - 没有它我有错误“/usr/bin/ld: cannot find -lgcc_s”)。


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

    OBJS := a.ro b.ro c.ro main.ro
    
    all:    test_app
    
    test_app:   $(OBJS)
        g++ -o $@ $^
    
    %.o:    %.cpp
        g++ -c -o $@ $<
    
    %.ro:   %.o
        g++ -Wl,-i -nostdlib -nostartfiles -o $@ $<
    
    • 基本上为每个对象创建可重定位文件(这可能是 obj 文件链接到可执行文件的重要部分),然后只更新必要的可重定位文件。对于最后的链接步骤,使用可重定位文件将所有内容链接在一起(但之前已经完成了部分链接)。

    还可以创建对象文件的“组”,将其分组到一个可重定位文件中,这样最后它们的数量就会减少(但不确定这是否会在最后带来任何东西)。

    【讨论】:

    • 您能多写几句我使用这些选项时的工作流程吗?例如假设我的源文件是a.cppb.cppc.cpp,分别编译,没有包含,并且我希望在重新编译a.cpp 时能够做更少的链接工作。我最初应该运行什么以及使用新的a.o 应该运行什么?
    • 使用示例 makefile 更新
    • 关于第二个 makefile:关键是 gcc 能够轻松地将 .ro 文件组合成一个可执行文件。好的,但是 - 为什么我们甚至需要 .cpp -> .o 步骤呢?为什么不立即执行 .cpp -> .ro?
    • 是的,我认为这也应该以同样的方式工作,直接创建可重定位的 obj。
    • ld -r 做可重定位链接,这与增量链接完全不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多