【问题标题】:Requirements to use flto使用 flto 的要求
【发布时间】:2015-10-19 16:52:40
【问题描述】:

如果我想用-flto 编译我的项目,用--enable-gold 构建gcc 就足够了,还是我还需要构建gold 并用它替换ld?我还需要其他标志吗?即我正在这样做

gcc -flto one.c two.c

【问题讨论】:

    标签: gcc ld binutils lto gold-linker


    【解决方案1】:

    根据https://gcc.gnu.org/wiki/LinkTimeOptimization#Requirements

    尽管有“链接时间”的名称,LTO 不需要使用任何特殊的链接器功能。所需的基本机制是检测目标文件中的 GIMPLE 部分。这目前在collect2 中实现。因此,LTO 可以在 GCC 已经支持的任何链接器上工作。

    此外,GCC documentation-fuse-linker-plugin 表示:

    当 GCC 中的 LTO 支持启用并且 GCC 被配置为与支持插件(GNU ld 2.21 或更新版本或黄金)的链接器一起使用时,此选项默认启用。

    因此您根本不需要gold,即使您想使用特殊的“链接器插件”功能从库档案中的目标文件中获取优化信息。


    -flto documentation 中有使用示例。要么

          gcc -o myprog -flto -O2 foo.c bar.c
    

          gcc -c -O2 -flto foo.c
          gcc -c -O2 -flto bar.c
          gcc -o myprog -flto -O2 foo.o bar.o
    

    会起作用的。


    截至GCC 4.9,您甚至不需要-flto 进行链接:

    唯一需要记住的重要一点是,要启用链接时优化,您需要使用 GCC 驱动程序来执行链接步骤。如果所涉及的任何对象是使用-flto 编译的,则 GCC 会自动执行链接时优化。

    截至GCC 5:

    与早期的 GCC 版本相反,链接命令行上传递的优化和目标选项被忽略。

    【讨论】:

    • 我正在使用 ld 2.24,它说 -plugin 是一个无法识别的选项。另外,使用您的最后一个示例,如果我将 -flto 离开最后阶段,则生成的可执行文件的 md5sum 与 -flto 相同。
    • 你从哪里得到-plugin
    • @chewsocks 您使用的是哪个版本的 gcc?
    • 我认为有必要有一个支持插件的ld,我通过ld -plugin进行了测试。从阅读更多gcc 文档来看,如果编译是使用-flto 完成的,并且gcc 用于链接阶段,那么无论如何都会完成链接时间优化。
    • gcc 版本 6.0.0 20150529(实验性)(GCC)
    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2021-06-29
    相关资源
    最近更新 更多