如何将 GCC LTO 与不同优化的目标文件一起使用?
How to use GCC LTO with differently optimized object files?
我正在使用 arm-none-eabi-gcc
为基于 Cortex-M4 的微控制器编译可执行文件。非性能关键代码使用 -Os
(针对可执行代码大小进行了优化)进行编译,性能关键部分使用另一个优化标志进行编译,例如。 -Og
/ -O2
等等
在这样的构建中使用 -flto
安全吗?如果是这样,应该将哪个优化标志传递给链接器?
根据 GCC documentation 关于优化选项:
It is recommended that you compile all the files participating in the same link with the same options
这样的说法比较含糊。然而,在深入研究 release notes of GCC 5 时,还有一些额外的细节:
Command-line optimization and target options are now streamed on a per-function basis and honored by the link-time optimizer. This change makes link-time optimization a more transparent replacement of per-file optimizations. It is now possible to build projects that require different optimization settings for different translation units (such as -ffast-math, -mavx, or -finline).
以及有关哪些标志受此类限制影响以及哪些不受此类限制影响的信息:
Note that this applies only to those command-line options that can be passed to optimize and target attributes. Command-line options affecting global code generation (such as -fpic), warnings (such as -Wodr), optimizations affecting the way static variables are optimized (such as -fcommon), debug output (such as -g), and --param parameters can be applied only to the whole link-time optimization unit. In these cases, it is recommended to consistently use the same options at both compile time and link time.
在您的场景中,优化标志 -Og
、-O2
和 -Os
可以作为优化属性传递,并且不属于编译时间和 link 时间标志应该是相同的。所以是的,在这样的构建中使用 -flto
应该是安全的。
关于在 link 时传递的优化标志,如发行说明中所述:
Contrary to earlier GCC releases, the optimization and target options
passed on the link command line are ignored.
GCC 自动确定要使用的优化级别,这是编译目标文件时使用的最高级别。因此,您不需要将任何 -O
优化选项传递给 linker。
我正在使用 arm-none-eabi-gcc
为基于 Cortex-M4 的微控制器编译可执行文件。非性能关键代码使用 -Os
(针对可执行代码大小进行了优化)进行编译,性能关键部分使用另一个优化标志进行编译,例如。 -Og
/ -O2
等等
在这样的构建中使用 -flto
安全吗?如果是这样,应该将哪个优化标志传递给链接器?
根据 GCC documentation 关于优化选项:
It is recommended that you compile all the files participating in the same link with the same options
这样的说法比较含糊。然而,在深入研究 release notes of GCC 5 时,还有一些额外的细节:
Command-line optimization and target options are now streamed on a per-function basis and honored by the link-time optimizer. This change makes link-time optimization a more transparent replacement of per-file optimizations. It is now possible to build projects that require different optimization settings for different translation units (such as -ffast-math, -mavx, or -finline).
以及有关哪些标志受此类限制影响以及哪些不受此类限制影响的信息:
Note that this applies only to those command-line options that can be passed to optimize and target attributes. Command-line options affecting global code generation (such as -fpic), warnings (such as -Wodr), optimizations affecting the way static variables are optimized (such as -fcommon), debug output (such as -g), and --param parameters can be applied only to the whole link-time optimization unit. In these cases, it is recommended to consistently use the same options at both compile time and link time.
在您的场景中,优化标志 -Og
、-O2
和 -Os
可以作为优化属性传递,并且不属于编译时间和 link 时间标志应该是相同的。所以是的,在这样的构建中使用 -flto
应该是安全的。
关于在 link 时传递的优化标志,如发行说明中所述:
Contrary to earlier GCC releases, the optimization and target options passed on the link command line are ignored.
GCC 自动确定要使用的优化级别,这是编译目标文件时使用的最高级别。因此,您不需要将任何 -O
优化选项传递给 linker。