3

環境 :

lto (リンク時コンパイル) の仕組みを理解しようとしている

コード:

私はそれらのファイルを持っています:

ジュリア.h:

#ifndef JULIA_H
#define JULIA_H
#include <stdio.h>
int julian();

#endif // JULIA_H

julia.c :

#include "julia.h"

int julian()
{
    printf("Hello Worldu!\n");
    return 0;
}

次のように共有ライブラリとしてコンパイルされます: 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;
}

コンパイル: gcc -O3 main.c -I/path/to/inc -L/path/to/lib -Wl,-rpath=/path/to/lib -ljulia -flto

それは罰金をコンパイルします。

質問 :

では、これは hello world プログラムですが、LTO を正しく使用していますか? リンケージを最適化するのに必要なのはそれだけですか?

ありがとう

4

2 に答える 2

13

keltarが言ったように、LTO は共有ライブラリには影響しません。しかし...

LTO は静的ライブラリで動作します

オプションを に置き換えargcc-ar追加するだけ--plugin gccpath/liblto_plugin.soです。この LTO プラグインは、宣言、型、コールグラフ、および GIMPLE 表現を LTO でコンパイルされたオブジェクトから静的ライブラリにコピーします。(ranlibに置き換えても同じgcc-ranlib)

あなたの例では

# First retrieve the GCC path
gccpath=$(gcc -print-search-dirs | awk '/install/{print $2}')

# Compile the static library
gcc julia.c -o julia.o -flto -ffat-lto-objects
gcc-ar rcs libjulia.a julia.o --plugin $gccpath/liblto_plugin.so

# Compile & link the executable
gcc main.c libjulia.a -flto -Ofast -march=native

注: -OfastGCC-4.6 [ref]で導入されました(それ以外の場合は を使用-03)

アップデートMakefile

GCCPATH = $(shell gcc -print-search-dirs | awk '/install/{print $$2}')
AR      = gcc-ar
RANLIB  = gcc-ranlib
ARFLAGS     += --plugin $(GCCPATH)/liblto_plugin.so
RANLIBFLAGS += --plugin $(GCCPATH)/liblto_plugin.so
CFLAGS      += -flto -ffat-lto-objects
CXXFLAGS    += -flto -ffat-lto-objects
LDFLAGS     += -flto=8    # 8 -> compiles using 8 threads

実際のコンパイルはリンク時に行われることを忘れないでください。したがって、最適化フラグをCFLAGS(and CXXFLAGS) からLDFLAGS;-) に移動してください。もう 1 つ、デバッグ情報と LTO は GCC-4.9 ではまだ実験的です。GCC-5.0 ではこの点が改善されるはずです...

于 2015-02-26T19:14:49.433 に答える
2

LTO は共有ライブラリには影響しません。LTO を認識せず、実行時にコードを変更できない動的リンカーによってリンクされています。

さらに、LTO は静的ライブラリでも動作しませんが、いつか動作するようになるでしょう (gcc wiki では TODO です)。

しかし、はい、有効にするために必要なのは、コンパイルとリンクの両方-fltoのフェーズで使用することです。

于 2014-07-14T10:14:41.470 に答える