问题标签 [lto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3133 浏览

c++ - 如何编写启用 LTO 的代码?

在编写代码或构建脚本以使用 LTO 进行编译时,需要牢记哪些注意事项和陷阱?

这个问题背后的动机是更好地理解为什么某些项目在启用 LTO 时编译不干净。特别是,我无法在启用 LTO 的情况下构建ICU,无论是在 MSVC 还是在 GCC 中。在其他情况下,我可以使用给定的工具链版本启用 LTO,但不能使用另一个(更新的)版本;例如,这种情况发生在libiconv中。

在我遇到的所有失败案例中,都涉及由于未解析的符号导致的链接失败。

为什么会发生这种情况?这是工具链、构建脚本还是源代码的问题?

0 投票
1 回答
681 浏览

c++ - 使用 LTO 静态链接的可执行文件(链接时间优化):如何使用以前构建的库来制作它

在带有 g++4.9 的 Ubuntu 上,我按照它的说明构建了一个静态库(称为 libZeroMQ.a),并且它是在没有“-flto”(链接时间优化)的情况下构建的。

现在我正在开发一个使用 libZeroMQ.a 的项目(称为 MyEXE),我将静态链接所有库。我希望用 LTO 构建 MyEXE。

我有两个选择:

A) 构建 MyEXE,在编译和链接中使用“-flto”。与之前构建的 libZeroMQ.a 链接。

B) 修改(更改)ZeroMQ 的配置/构建脚本,添加“-flto”,并重建 libZeroMQ.a。然后通过与新的 libZeroMQ.a 链接来构建 MyEXE。当然,在编译和链接 MyEXE 时仍然使用“-flto”。

在 MyEXE 的性能方面,我认为:

  1. B) 比 A) 好,因为它允许在链接时考虑优化更多代码(特别是 ZeroMQ 中的代码)。

  2. A) 仍然比完全不使用 LTO 好。

我的理解正确吗?谢谢!

0 投票
1 回答
933 浏览

ios - ld:为 tvOS 构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64

我正在为 tvOS 构建一个项目(如果它很重要,目标是一个框架)并从链接器获取错误:

ld:为 tvOS 构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64

我跑otool -l *.o进去OBJECTS_FILE_DIR_normal发现其中一个 .o 文件实际上是为 iOS 而不是 tvOS 构建的。

问题是该 .o 没有对应的源文件(*.mm 或 *.cpp)。它被调用<ProjectName>_lto.o,我在构建日志中看不到该文件的任何编译器调用。它在链接器命令行中只出现一次:

LLVM_LTO构建设置没有明确设置,但默认为NO. 将其设置为NO明确没有帮助。

我正在使用 Xcode 8.3.2 (8E2002)。

所以我的问题是:为什么要创建这个目标文件,为什么要为错误的目标平台创建它?

0 投票
1 回答
1576 浏览

gcc - 抑制具有灵活数组的结构的 -Wlto-type-mismatch 警告

我正在做一个 gcc 编译-Wlto-type-mismatch-Werror设置(为了项目的其余部分)。我有extern struct一个灵活的数组,它会引发lto-type-mismatch警告/错误。

以下是将代码简化为示例:

呵呵:

交流:

公元前:

编译(此处使用 arm gcc,但使用本机 gcc 也会失败)

我尝试将一个或两个声明包装在

但我无法抑制警告,可能是因为它是链接时优化,并且此时#pragma线路早已消失。

问题

你能建议一些方法来编译它并在其他地方保留警告吗?(或者-Wlto-type-mismatch不应该抱怨灵活数组?如果是这样,我可以提交错误报告。)

0 投票
0 回答
790 浏览

c++ - 如何使用 Premake 5 编译支持 Linux LTO 的库?

太聪明了,我转向你。我正在尝试在 Ubuntu 16.04 LTS 上使用 LTO 和 Makefiles 和 Premake 5 构建一个 64 位静态库。

这是我正在使用的预制脚本:

“运送”是错误的配置。我还将整个测试项目捆绑在一个 zip中,以便您尝试重现该问题。

我在编译 TestCore 库时遇到的错误首先是plugin needed to handle lto object,然后是plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so is not licensed under a GPL-compatible license

我们对于它可以做些什么呢 ?如果您有任何知识使其适用于 GCC,请提供帮助。

解压缩 zip 后如何重现 GCC 错误:

  1. cd testBreaking
  2. premake5 gmake
  3. cd 测试应用程序
  4. make config=shipping_linux_static TestCore(得到“处理lto对象所需的插件”错误)
  5. 取消注释 premake5.lua 的第 37 行以获得“未在 GPL 兼容许可下获得许可”错误
  6. 取消注释第 43 行以使用 gcc-ar 而不是 ar,请注意它也不起作用
  7. 使用 gcc 选项 -fuse-linker-plugin 没有帮助

更多系统信息:

  • Ubuntu 16.04 LTS
  • gcc 5.4,制作 4.1,ar 2.26.1
  • 预制 5.0.0-alpha11

我让它与 Clang 一起工作。使用toolset clang运输配置(使用 LLVM 3.9),该库似乎编译得很好。我得到了另一个错误:

error adding symbols: Archive has no index; run ranlib to add one

我设法通过调用来解决这个问题ranlib Build/Linux_Static/Shipping/libTestCore.a --plugin /usr/lib/llvm-3.9/lib/LLVMgold.so,然后再次调用。

所以它使用 Clang 很痛苦。

我读到我可以为这种事情创建一个特定的预制工具集,因为建议用它们的gcc-对应物替换所有 gnu utils(例如,gcc-ar而不是ar),但是快速修补premake.tools.gcc.ar = "gcc-ar"没有结果,我不太确定它会有所帮助.

0 投票
1 回答
1282 浏览

gcc - 如何将 GCC LTO 与不同优化的目标文件一起使用?

我正在arm-none-eabi-gcc为基于 Cortex-M4 的微控制器编译可执行文件。非性能关键代码使用-Os(针对可执行代码大小进行优化)和性能关键部分与另一个优化标志进行编译,例如。-Og/-O2等。

-flto在这样的构建中使用是否安全?如果是这样,应该将哪个优化标志传递给链接器?

0 投票
1 回答
576 浏览

llvm - 如何在 LLVM 中启用 CFI

我想用 LLVM 强制执行的 CFI 编译 nginx。我修改了 objs 目录中的 Makefile。修改包括: 1. 修改编译器:cc--> clang 2. 添加CFI相关参数: -flto -fvisibility=hidden -fsanitize=cfi 修改后的Makefile如下图

编译过程通过。但是在链接过程中会报一些错误:

根据clang 6.0.0的文档,CFI方案依赖于链接时优化(LTO),使用的链接器必须支持LTO(如gold插件)。关于LTO有一些资料:

http://llvm.org/docs/GoldPlugin.html

我仍然不知道如何处理这个问题,任何人都可以给我一些建议吗?

0 投票
0 回答
453 浏览

c++ - 带有升压文件系统的 LTO 标志的 gcc 静态链接失败

boost 版本 1.64
gcc 版本 6.4.1
Linux OpenSuse x64 42.2
Cmake 3.5.2

[链接,无 LTO] 有效:

[链接,使用 LTO] 不起作用:

错误:

gcc 6.4.1--> 使用和-std=gnu++11标记编译的 boost 库
-->gcc 4.8.5一切正常

0 投票
0 回答
158 浏览

objective-c - LLVM LTO(Link-time Optimization)对Objective-C代码有影响吗?

AFAIK,LTO 可以减少死代码并做一些跨文件内联。然而,Objective-C 是基于运行时的。一个方法是否确实被调用直到运行时才被解析,所以不可能在链接时减少 Objective-C 中的死方法,对吧?对于跨文件内联,它也不会发生,因为可以在运行时替换方法的实现。

那么,LTO 如何影响 Objective-C 代码呢?

我是 LLVM 的新手,所以任何建议都值得赞赏。

0 投票
3 回答
1219 浏览

c - 如何将 LTO 与符号版本控制相结合

我想使用符号版本控制和链接时优化 (LTO) 来编译一个共享库。但是,一旦我打开 LTO,一些导出的符号就会消失。这是一个最小的例子:

首先定义函数fun的两个实现:

创建版本脚本以确保仅导出fun :

第一次尝试,在没有 LTO 的情况下编译:

..正是它应该的样子。但是如果我用 LTO 编译:

..不再导出符号。

我究竟做错了什么?