试图了解lto(链接时间编译)的工作原理
我有这些文件:
julia.h:
#ifndef JULIA_H
#define JULIA_H
#include <stdio.h>
int julian();
#endif // JULIA_H
Run Code Online (Sandbox Code Playgroud)
julia.c:
#include "julia.h"
int julian()
{
printf("Hello Worldu!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译为共享库如下:gcc -O3 -fPIC -shared julia.c -o libjulia.so -L $ PWD -I $ PWD -flto
和我的主要计划:
main.c中
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "julia.h"
int main()
{
julian();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:GCC -O3 main.c中-I /路径/到/ INC -L /路径/到/ lib中-Wl,-rpath = /路径/到/ lib中-ljulia -flto
它编制罚款.
所以,这是一个hello world程序,但我是否正确使用LTO?是否只需要优化连接?
谢谢
我正在使用 CMake 为我的 C 编译启用 IPO(过程间优化):
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这会导致-flto添加编译器标志。然而,它还补充说-fno-fat-lto-objects:这意味着生成的目标文件将只有中间代码,而不是同时包含正确编译的代码和中间代码;这意味着链接器必须支持我的系统编译器的中间表示并且能够感知 IPO/LTO。
我没有要求-fno-fat-lto-objects,也不想。我可以让 CMake 不添加此选项吗?
说我有一个功能
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
Run Code Online (Sandbox Code Playgroud)
我可以编译并运行它没有任何问题; 如果我想要我可以通过的功能-D FEATURE_X,它的工作原理.
但是,如果我想do_something放入另一个文件(并且每次我决定更改选项时也不必重新编译该文件)该怎么办?如果它在同一个文件中,我会认为
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
Run Code Online (Sandbox Code Playgroud)
将正确使用死代码消除,取消呼叫.如果我把它放在另一个文件中,没有LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
Run Code Online (Sandbox Code Playgroud)
它不会删除代码(它无法知道).因此,在启用链接时优化的情况下,编译器是否可以检测FEATURE_X链接时的值,确定是否使用了代码,并在适当的情况下将其删除?
最近我遇到了一个关于 LTO 的奇怪问题,根据是否使用,-ffast-math我的“pow”(in)调用得到了不一致的结果。cmath-flto
$ g++ --version
g++ (GCC) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Sep 3 2019 /lib64/libc.so.6 -> libc-2.17.so
$ ll /lib64/libm.so.6
lrwxrwxrwx 1 root root 12 Sep 3 2019 /lib64/libm.so.6 -> libm-2.17.so
$ cat /etc/redhat-release
CentOS Linux release …Run Code Online (Sandbox Code Playgroud)