问题标签 [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.
cmake - 如何使用 Clion 启用 LinkTimeOptimization?
我想优化我的程序链接时间。我必须在哪里输入才能启用它?
如果它重要(我希望它不重要):我在 Windows 上使用 MinGW-w64 5.0。
编辑:我真的不明白为什么我使用 CLion 并不重要。我知道 - 目前 - 它使用 CMake 作为底层构建系统。
但是 a) 将来 CMake 将不会是 CLion 将支持的唯一构建系统(请参阅此处),因此引用 CMake 本身并不能解决问题。
b) 调整 CMakeLists.txt 仍然需要我单独配置每个项目。我要求一种配置 IDE 的方法,所以它会为我做。
我也不认为这本身就是一个无法解决的问题。可能有一个配置或插件可以解决问题。我没有找到它..但这并不意味着我的问题无法回答。
c - 调试链接警告“符号类型与原始声明不匹配”
我正在尝试系统地调试以下问题:
我这个综合测试,我确切地知道问题出在哪里 -在这里aaaaaaaa
定义int
,但short
在那里。在我真正的问题中,链接结合了许多对象,这些对象是复杂构建过程的结果,我不知道哪两个对象包含冲突的定义。
我想通过检查每个链接的目标文件来解决它,看看每个符号是如何定义的,并找到一对定义不匹配的。然后我将跟踪构建过程以查看它们是如何构建的并找到根本原因。但我不知道如何查看对象的定义方式。
我试过nm -A
and objdump -t
,但它们没有显示符号类型/大小:
我的编译器:
gcc - 将 GCC 的链接时优化与静态链接库一起使用
我正在尝试使用带有-flto
GCC (6.1.1) 标志的链接时优化。
虽然它适用于我的代码,但它没有链接到我也在构建和链接我的项目的静态链接库(它是Engine并且库是glsl-optimizer,仅供参考)。
这是输出:
在那之后,当然,我得到了一些对某些函数的“未定义引用”。
我做了一些研究,发现这可能是因为ar
,我应该尝试使用gcc-ar
,但我不确定我该怎么做。
另外,我正在使用不支持 lto 的 CMake(某些平台上的英特尔编译器除外,所以我读了......)。即使,我尝试使用:
这没有用。
另外,我尝试了 GCC 的-fuse-linker-plugin
标志,但它不起作用。
我想我必须直接使用旧方法手动完成gcc-ar
,或者可能有其他方法?
c++ - 启用链接时优化会导致链接器错误?
我有可以编译和链接的代码。
我现在正在尝试启用链接时优化,但是添加-flto
到我的编译器和链接器标志会导致链接器错误:
我添加的唯一标志是-flto
.
要清楚:
- 没有
-flto
应用程序构建和链接正常 - 使用
-flto
(并且没有其他更改),应用程序无法链接到上述错误
是什么导致此链接器错误?
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 转换?
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 有自己的指令)。
- 即使用户将编译器覆盖为不是系统默认值的编译器也可以工作。
- 交叉编译时工作
debugging - gcc LTO 似乎去除了调试符号
我有一个项目,在 ARM Cortex-M4 处理器上运行,我试图在其中包含 gcc 链接时间优化 (LTO) 功能。
目前我的编译和链接标志是:
这些标志一切正常,我能够正确调试项目。
然后我尝试添加-flto
到 CFLAGS。尽管该程序运行良好,但我不再能够调试该项目,gdb 抱怨缺少调试符号。在 ELF 文件上运行objdump -g
(启用 LTO)会得到以下输出:
注意缺少的.debug_info
部分。回到项目设置并仅从-flto
CFLAGS 中删除即可解决问题。objdump -g
在没有 LTO 的 ELF 文件上现在显示一个.debug_info
部分,其中填充了对我项目中函数的正确引用,并且调试再次正常工作。
如何让 LTO 和调试符号一起玩得很好?
编辑:忘记包含我的 gcc 信息。我使用的是GNU ARM Embedded Toolchain,测试是在 5.4-2016q2 和 5.4-2016q3 版本上进行的。
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)
我应该担心,还是我可以忽略这个警告?在前一种情况下,我该如何解决这个问题?
c++ - 将虚函数的所有返回映射到它们对应的返回地址
基本上我想通过添加运行时检查来进行调用者/被调用者映射,这些检查在执行每个 C/C++ 返回之前检查允许的范围。
对于给定的类层次结构,我有一个所有虚拟对象调度到允许的虚拟表条目的正向映射。此数据是在 LLVM LTO 期间收集的。现在我想对所有的虚函数返回做同样的事情。由于前向映射告诉我应该可以访问哪些功能,我需要确定以便精确地向后映射以下信息。
从 Clang/LLVM 中的何处获取包含在虚拟函数中的每个返回的返回地址。是否有可能在编译期间获得这些信息?
如何确定某个返回值包含在哪个函数中。接下来如何确定该函数属于哪个类?
在此先感谢,保罗
gcc - eglMakeCurrent 触发的堆栈保护
我们遇到了一款名为 Motorla RAZR i 的奇怪设备,它具有 x86 CPU 和 Android 版本 4.1.2(大约 2013 年)。
此设备有时会在本机代码中的 GL 操作中崩溃。我们最终将这个错误减少到只有几行无辜的函数调用:
编译时-fstack-protector-strong
(如果我理解正确,这是默认值),在特定设备上调用此函数总是会导致
但是,如果我使用-fno-stack-protector
,执行将继续,就好像没有发生任何不好的事情一样。这可能(如果我正确理解情况)成为任何进一步执行的陷阱。更危险(因为不明确),将-flto添加到 CFLAGS 会隐藏崩溃。
在上面的代码中,为了简洁起见,我删除了错误检查。实际上,所有调用都会成功。此外,清理部分不会更改eglMakeCurrent()的堆栈抖动行为。
我真的很高兴创建一些沙箱来安全地执行此类代码,而不会危及我的应用程序的其余部分。
附言
我在 Android 上遇到了另一个奇怪的堆栈损坏案例,使用 glGetProgramiv 时“检测到堆栈损坏”,但似乎没有提出解决方案。
在测试用例中,但不是在实际应用程序中,egl 上下文的释放会有所帮助:我在Cleanup
eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)
之前调用。反汇编显示-flto关闭堆栈保护器。这不应该是一个很大的失望:如果我们的目标是优化调用,浪费时间检查是愚蠢的吗?