标签: lto

gcc LTO - 共享库 - 我是对的吗?

背景:

试图了解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?是否只需要优化连接?

谢谢

c gcc shared-libraries lto

3
推荐指数
1
解决办法
4097
查看次数

当我启用 LTO/IPO 时,为什么 CMake 设置 -no-fat-lto-objects?

我正在使用 CMake 为我的 C 编译启用 IPO(过程间优化):

set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这会导致-flto添加编译器标志。然而,它还补充说-fno-fat-lto-objects:这意味着生成的目标文件将只有中间代码,而不是同时包含正确编译的代码和中间代码;这意味着链接器必须支持我的系统编译器的中间表示并且能够感知 IPO/LT​​O。

我没有要求-fno-fat-lto-objects,也不想。我可以让 CMake 不添加此选项吗?

c compilation cmake intermediate-language lto

3
推荐指数
1
解决办法
1688
查看次数

GCC LTO是否执行跨文件死代码消除?

说我有一个功能

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链接时的值,确定是否使用了代码,并在适当的情况下将其删除?

gcc dead-code lto

2
推荐指数
1
解决办法
429
查看次数

-ffast-math 的奇怪 LTO 行为

概括

最近我遇到了一个关于 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)

c++ glibc g++ lto fast-math

1
推荐指数
1
解决办法
139
查看次数

如何编写启用LTO的代码?

在编写代码或构建脚本以使用LTO进行编译时,需要记住哪些注意事项和陷阱?

这个问题背后的动机是更好地理解为什么启用LTO时为什么某些项目不能完全编译。特别是,无论是在MSVC还是在GCC中,我都无法构建启用LTO的ICU。在其他情况下,我可以使用给定的工具链版本启用LTO,但不能使用另一个(较新的)版本启用LTO。例如,这发生在libiconv中

在我遇到的所有失败案例中,都涉及到由于符号未解析导致的链接失败。

为什么会这样呢?这是工具链,构建脚本还是源代码的问题?

c c++ gcc visual-c++ lto

0
推荐指数
1
解决办法
1276
查看次数