问题标签 [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.
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 的性能方面,我认为:
B) 比 A) 好,因为它允许在链接时考虑优化更多代码(特别是 ZeroMQ 中的代码)。
A) 仍然比完全不使用 LTO 好。
我的理解正确吗?谢谢!
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)。
所以我的问题是:为什么要创建这个目标文件,为什么要为错误的目标平台创建它?
gcc - 抑制具有灵活数组的结构的 -Wlto-type-mismatch 警告
我正在做一个 gcc 编译-Wlto-type-mismatch
和-Werror
设置(为了项目的其余部分)。我有extern
struct
一个灵活的数组,它会引发lto-type-mismatch
警告/错误。
以下是将代码简化为示例:
呵呵:
交流:
公元前:
编译(此处使用 arm gcc,但使用本机 gcc 也会失败)
我尝试将一个或两个声明包装在
但我无法抑制警告,可能是因为它是链接时优化,并且此时#pragma
线路早已消失。
问题
你能建议一些方法来编译它并在其他地方保留警告吗?(或者-Wlto-type-mismatch
不应该抱怨灵活数组?如果是这样,我可以提交错误报告。)
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 错误:
- cd testBreaking
- premake5 gmake
- cd 测试应用程序
- make config=shipping_linux_static TestCore(得到“处理lto对象所需的插件”错误)
- 取消注释 premake5.lua 的第 37 行以获得“未在 GPL 兼容许可下获得许可”错误
- 取消注释第 43 行以使用 gcc-ar 而不是 ar,请注意它也不起作用
- 使用 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"
没有结果,我不太确定它会有所帮助.
gcc - 如何将 GCC LTO 与不同优化的目标文件一起使用?
我正在arm-none-eabi-gcc
为基于 Cortex-M4 的微控制器编译可执行文件。非性能关键代码使用-Os
(针对可执行代码大小进行优化)和性能关键部分与另一个优化标志进行编译,例如。-Og
/-O2
等。
-flto
在这样的构建中使用是否安全?如果是这样,应该将哪个优化标志传递给链接器?
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
我仍然不知道如何处理这个问题,任何人都可以给我一些建议吗?
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
一切正常
objective-c - LLVM LTO(Link-time Optimization)对Objective-C代码有影响吗?
AFAIK,LTO 可以减少死代码并做一些跨文件内联。然而,Objective-C 是基于运行时的。一个方法是否确实被调用直到运行时才被解析,所以不可能在链接时减少 Objective-C 中的死方法,对吧?对于跨文件内联,它也不会发生,因为可以在运行时替换方法的实现。
那么,LTO 如何影响 Objective-C 代码呢?
我是 LLVM 的新手,所以任何建议都值得赞赏。
c - 如何将 LTO 与符号版本控制相结合
我想使用符号版本控制和链接时优化 (LTO) 来编译一个共享库。但是,一旦我打开 LTO,一些导出的符号就会消失。这是一个最小的例子:
首先定义函数fun的两个实现:
创建版本脚本以确保仅导出fun :
第一次尝试,在没有 LTO 的情况下编译:
..正是它应该的样子。但是如果我用 LTO 编译:
..不再导出符号。
我究竟做错了什么?