问题标签 [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 回答
245 浏览

cmake - 如何使用 Clion 启用 LinkTimeOptimization?

我想优化我的程序链接时间。我必须在哪里输入才能启用它?

如果它重要(我希望它不重要):我在 Windows 上使用 MinGW-w64 5.0。

编辑:我真的不明白为什么我使用 CLion 并不重要。我知道 - 目前 - 它使用 CMake 作为底层构建系统。

但是 a) 将来 CMake 将不会是 CLion 将支持的唯一构建系统(请参阅此处),因此引用 CMake 本身并不能解决问题。

b) 调整 CMakeLists.txt 仍然需要我单独配置每个项目。我要求一种配置 IDE 的方法,所以它会为我做。

我也不认为这本身就是一个无法解决的问题。可能有一个配置或插件可以解决问题。我没有找到它..但这并不意味着我的问题无法回答。

0 投票
1 回答
1369 浏览

c - 调试链接警告“符号类型与原始声明不匹配”

我正在尝试系统地调试以下问题:

我这个综合测试,我确切地知道问题出在哪里 -在这里aaaaaaaa定义int,但short在那里。在我真正的问题中,链接结合了许多对象,这些对象是复杂构建过程的结果,我不知道哪两个对象包含冲突的定义。

我想通过检查每个链接的目标文件来解决它,看看每个符号是如何定义的,并找到一对定义不匹配的。然后我将跟踪构建过程以查看它们是如何构建的并找到根本原因。但我不知道如何查看对象的定义方式。

我试过nm -Aand objdump -t,但它们没有显示符号类型/大小:

我的编译器:

0 投票
2 回答
16345 浏览

gcc - 将 GCC 的链接时优化与静态链接库一起使用

我正在尝试使用带有-fltoGCC (6.1.1) 标志的链接时优化。

虽然它适用于我的代码,但它没有链接到我也在构建和链接我的项目的静态链接库(它是Engine并且库是glsl-optimizer,仅供参考)。

这是输出:

在那之后,当然,我得到了一些对某些函数的“未定义引用”。

我做了一些研究,发现这可能是因为ar,我应该尝试使用gcc-ar,但我不确定我该怎么做。

另外,我正在使用不支持 lto 的 CMake(某些平台上的英特尔编译器除外,所以我读了......)。即使,我尝试使用:

这没有用。

另外,我尝试了 GCC 的-fuse-linker-plugin标志,但它不起作用。

我想我必须直接使用旧方法手动完成gcc-ar,或者可能有其他方法?

0 投票
0 回答
502 浏览

c++ - 启用链接时优化会导致链接器错误?

我有可以编译和链接的代码。

我现在正在尝试启用链接时优化,但是添加-flto到我的编译器和链接器标志会导致链接器错误:

我添加的唯一标志是-flto.

要清楚:

  • 没有-flto应用程序构建和链接正常
  • 使用-flto(并且没有其他更改),应用程序无法链接到上述错误

是什么导致此链接器错误?

0 投票
1 回答
821 浏览

llvm - lto链接后获取llvm IR

链接 lto 后有没有办法获得 llvm IR?例如,我有以下行:

$ clang -flto -O2 ac main.c -fuse-ld=gold -v -save-temps

所以我想获得 llvm IR,其中文件a.c和文件main.c链接在一个monlithic.bc(或monlithic.o与 IR)中。我尝试添加选项-Wl,-plugin-opt=save-temps,但出现错误:

libLLVMLTO:未知的命令行参数“保存临时”。尝试:'libLLVMLTO -help' clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

还有什么方法可以转储 IR 的 lto 转换?

0 投票
2 回答
1276 浏览

gcc - 使用 gcc-ar 和 gcc-ranlib 的 autoconf 配方

我在一个在 GCC 和 Clang 下编译并构建静态库的项目中使用链接时优化 (LTO)。它与 GCC 4.8 一起工作,但 GCC 5.4 制作了瘦 LTO 对象,当 automake 尝试用ar它构建静态库时失败,因为它需要 wrapper script gcc-ar

有没有一个很好的例子,我可以看看如何使用 automakegcc-ar而不是ar(类似地gcc-ranlib)?我可能可以破解一些东西,但理想情况下它应该:

  • 为编译器使用适当的工具(Clang 有自己的指令)。
  • 即使用户将编译器覆盖为不是系统默认值的编译器也可以工作。
  • 交叉编译时工作
0 投票
3 回答
3588 浏览

debugging - gcc LTO 似乎去除了调试符号

我有一个项目,在 ARM Cortex-M4 处理器上运行,我试图在其中包含 gcc 链接时间优化 (LTO) 功能。

目前我的编译和链接标志是:

这些标志一切正常,我能够正确调试项目。

然后我尝试添加-flto到 CFLAGS。尽管该程序运行良好,但我不再能够调试该项目,gdb 抱怨缺少调试符号。在 ELF 文件上运行objdump -g(启用 LTO)会得到以下输出:

注意缺少的.debug_info部分。回到项目设置并仅从-fltoCFLAGS 中删除即可解决问题。objdump -g在没有 LTO 的 ELF 文件上现在显示一个.debug_info部分,其中填充了对我项目中函数的正确引用,并且调试再次正常工作。

如何让 LTO 和调试符号一起玩得很好?

编辑:忘记包含我的 gcc 信息。我使用的是GNU ARM Embedded Toolchain,测试是在 5.4-2016q2 和 5.4-2016q3 版本上进行的。

0 投票
1 回答
562 浏览

c++ - std::complex 之间的类型不匹配在 C++ 和 complex*16 中,在 gcc 6 下的 Fortran 中,具有链接时优化

我使用了一些从 C++ 调用 Fortran 例程的科学计算代码,它突然开始在 gcc 6 下发出警告。这是准系统问题:

mult考虑定义在 中的 Fortran 子例程mult.f90

我从 C++ 文件中调用它test.cpp

当我使用 g++-6 编译文件时,我收到以下警告:

如果我执行以下任何操作,警告就会消失:

  • 将 g++-6(我的版本是 6.2.0)替换为 g++-5(版本 5.4.1)
  • -flto不带标志编译
  • 使用 double(而不是 std::complex)和 real*8(而不是 complex*16)

我应该担心,还是我可以忽略这个警告?在前一种情况下,我该如何解决这个问题?

0 投票
1 回答
70 浏览

c++ - 将虚函数的所有返回映射到它们对应的返回地址

基本上我想通过添加运行时检查来进行调用者/被调用者映射,这些检查在执行每个 C/C++ 返回之前检查允许的范围。

对于给定的类层次结构,我有一个所有虚拟对象调度到允许的虚拟表条目的正向映射。此数据是在 LLVM LTO 期间收集的。现在我想对所有的虚函数返回做同样的事情。由于前向映射告诉我应该可以访问哪些功能,我需要确定以便精确地向后映射以下信息。

  1. 从 Clang/LLVM 中的何处获取包含在虚拟函数中的每个返回的返回地址。是否有可能在编译期间获得这些信息?

  2. 如何确定某个返回值包含在哪个函数中。接下来如何确定该函数属于哪个类?

在此先感谢,保罗

0 投票
1 回答
308 浏览

gcc - eglMakeCurrent 触发的堆栈保护

我们遇到了一款名为 Motorla RAZR i 的奇怪设备,它具有 x86 CPU 和 Android 版本 4.1.2(大约 2013 年)。

此设备有时会在本机代码中的 GL 操作中崩溃。我们最终将这个错误减少到只有几行无辜的函数调用:

编译时-fstack-protector-strong(如果我理解正确,这是默认值),在特定设备上调用此函数总是会导致

但是,如果我使用-fno-stack-protector,执行将继续,就好像没有发生任何不好的事情一样。这可能(如果我正确理解情况)成为任何进一步执行的陷阱。更危险(因为不明确),将-flto添加到 CFLAGS 会隐藏崩溃。

在上面的代码中,为了简洁起见,我删除了错误检查。实际上,所有调用都会成功。此外,清理部分不会更改eglMakeCurrent()的堆栈抖动行为。

我真的很高兴创建一些沙箱来安全地执行此类代码,而不会危及我的应用程序的其余部分。

附言

  1. 我在 Android 上遇到了另一个奇怪的堆栈损坏案例,使用 glGetProgramiv 时“检测到堆栈损坏”,但似乎没有提出解决方案。

  2. 在测试用例中,但不是在实际应用程序中,egl 上下文的释放会有所帮助:我在CleanupeglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)之前调用。

  3. 反汇编显示-flto关闭堆栈保护器。这不应该是一个很大的失望:如果我们的目标是优化调用,浪费时间检查是愚蠢的吗?