问题标签 [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 投票
0 回答
82 浏览

c++ - 静态库的跨 TU 优化

链接时优化通常通过将一些 IR 放入目标文件而不是实际的机器代码来实现。因此,在处理静态库时,它只是此类 IR 文件的集合,并且每次更改使用它的代码时都必须执行 LTO。如果您构建一个共享库而不是 LTO 只完成一次,并且 dll 内的代码已完全优化。

在处理静态库时,是否也可以跨翻译单元进行一些优化?我知道这与您不能做出任何整个程序的假设不同,但是是否应该可以做一些基本的事情,例如内联未在标头中定义的 setter/getter?

0 投票
2 回答
2195 浏览

c - ARM + gcc:不要使用一个大的 .rodata 部分

我想用 gcc 编译一个带有 ARM 处理器链接时间优化的程序。当我在没有 LTO 的情况下编译时,系统会被编译。当我启用 LTO(使用 -flto)时,我收到以下汇编错误:

错误:无效的文字常量:池需要更近

环顾网络,我发现这与我系统中的常量有关,这些常量放置在一个名为 .rodata 的特殊部分中,该部分称为常量池,位于我系统中的 .text 部分之后。似乎在使用 LTO 编译时,由于内联和其他优化,这个 .rodata 部分离指令太远了,因此不再可能对常量进行寻址。是否可以将常量放在使用它们的函数之后?或者是否可以使用另一种寻址模式,以便仍然可以寻址 .rodata 部分?谢谢。

0 投票
1 回答
739 浏览

gcc - GCC(Sourcery codebench 2013.11)链接时间优化忽略-fno-short-enums

我有两个微不足道的源文件

obj1.cc:

obj2.cc:

我正在使用 Sourcery codebench lite 2013.11:

我使用编译每个源文件

如果我在没有 -flto 的情况下链接它们,则不会调用链接时间优化,并且我会得到一个标记为具有 int 大小的枚举的目标文件:

但是,如果我只是简单地添加-flto到链接器调用中,则输出声称它具有小枚举:

如果我使用 运行链接步骤-v,当 gcc 进入 lto 阶段时,我可以看到:

在我看来,它确实像是在 LTO 步骤中移除-fno-short-enums的东西。COLLECT_GCC_OPTIONS我怀疑这可能是一个普遍的 gcc 问题,并且不限于 Sourcery 构建。

这是一个 gcc 错误吗?我需要 gcc 生成没有短枚举的目标文件,以便链接到使用 32 位枚举构建的某些库。有没有办法在不从源代码重建 gcc 的情况下实现这个目标?

更新:我刚刚在 Ubuntu 14.04 中使用 arm-none-eabi-gcc 4.8.2-14ubuntu1+6toolchain 确认了完全相同的行为(http://packages.ubuntu.com/trusty/devel/gcc-arm-none-eabi )

0 投票
2 回答
1031 浏览

webrtc - 在没有 LTO 的情况下构建 Chromium、WebRTC

我在 Arch Linux x86_64 上,尝试构建 WebRTC 库。执行此操作时出现编译错误:

链接时间优化似乎存在问题。但是,我无法弄清楚如何在不启用 LTO 的情况下构建 WebRTC。如果我手动运行失败的命令并 append -fno-lto,则链接正常。如何在gyp配置中添加或更改编译器/链接器标志,以便将其应用于所有内容?

0 投票
0 回答
655 浏览

driver - Windows 上 LTFS 的 DeviceIOControl 错误

我正在尝试将我的 HP LTO 驱动器与 Windows 中的 LTFS 向导一起使用。我收到以下错误(Windows 7 32 位和 Windows Server 2008 32 位):

在 Windows 中使用 Library & Tape Tools 没有问题,并且该驱动器在 CentOS Linux 上与 Library & Tape Tools 和 LTFS 都可以正常工作。

为什么只有 Windows 上的 LTFS 有问题?我该如何解决这个错误?

0 投票
1 回答
574 浏览

c++ - 链接时间优化与多线程支持冲突

正如我在 中阅读了改进的链接时间优化支持一样g++-4.9,我想试一试。可悲的是,我在运行时遇到异常,特别std::system_errore.what() == Enable multithreading to use std::thread: Operation not permitted.

现在我通常知道如何修复该错误:添加-pthread到我的编译器调用中,但事实上,我已经有了这个参数!

我的示例代码是:

编译时使用(X 为 7、8 或 9)

按预期完美运行,没有运行时错误。

然而,

异常失败system_error

问题:

这种行为是有意的(修复方法是什么?)还是一个错误?

(在这个问题可能出现之前:我的编译器都是用 构建的--enable-threads=posix

0 投票
2 回答
5836 浏览

c - gcc LTO - 共享库 - 我说得对吗?

语境 :

试图了解 lto(链接时间编译)是如何工作的

代码:

我有这些文件:

朱莉娅.h:

朱莉娅.c:

像这样编译为共享库: gcc -O3 -fPIC -shared julia.c -o libjulia.so -L$PWD -I$PWD -flto

和我的主程序:

主程序

编译:gcc -O3 main.c -I/path/to/inc -L/path/to/lib -Wl,-rpath=/path/to/lib -ljulia -flto

它编译罚款。

问题 :

所以,这是一个 hello world 程序,但我用 LTO 做得对吗?是否只需要优化链接?

谢谢

0 投票
1 回答
1890 浏览

g++ - g++如何做部分链接时间优化(-flto)

我 man g++ 并仔细阅读了 lto 部分。现在我想知道如何像 icpc 编译器中的 -ipo-c 一样进行部分链接时间优化。例如:

现在它将生成包含 GIMPLE(GCC 的内部表示之一)的 ao 和 bo。我想结合 ao 和 bo 来生成一个真实的对象 co 文件。这意味着只是超过两个 cpp 文件而不是整个程序。任何想法?

原因是我需要将fortran代码和c++代码结合在一起,所以最后的链接步骤是

fo 由 ifort 生成。因为 ifort 不知道 GIMPLE 是什么。所以最后的链接步骤将失败。

0 投票
2 回答
11113 浏览

c++ - 如何将 lto 与静态库一起使用?

当我尝试使用 构建静态库时-flto,出现未定义的引用错误:

图书馆.cpp

主.cpp

编译输出

如果我链接library.o而不是library.a. 我错过了什么?这是 GCC 4.9.1 和 binutils 2.24。

0 投票
1 回答
951 浏览

c++ - 使用替换的运算符 new 进行 Clang 链接时优化导致 valgrind 中的 free()/delete 不匹配

当使用带有 -flto 的 clang 3.5.0 并与共享库链接时,共享库中的调用似乎与从主对象operator delete调用的符号解析顺序不同。operator new例子:

共享.cpp

主.cpp

当我构建它并通过 valgrind 运行它时,会发生以下情况:

你可以看到它正在寻找 valgrind's operator delete,但使用operator newfrom main.cpp。相比之下,与 gcc 完全相同的构建(只需替换clang++g++)工作正常。任何想法为什么,或如何解决它?

编辑:符号导入和导出,按照@Deduplicator 的要求。