5

奇妙さ

「肥大化」コンパイル用の追加パラメータを使用せずに Google プロトコル バッファをコンパイルし、次のコマンドでコンパイルしました./configure CXXFLAGS="-ffunction-sections -fdata-sections"。du-h は次のことを明らかにします。

120K ./bloat/bin
124K ./bloat/include/google/protobuf/io
8.0K ./bloat/include/google/protobuf/compiler/java
12K ./bloat/include/google/protobuf/compiler/python
8.0K ./bloat/include/google/protobuf/compiler/cpp
128K ./bloat/include/google/protobuf/compiler
52K ./bloat/include/google/protobuf/stubs
848K ./bloat/include/google/protobuf
852K ./bloat/include/google
856K ./bloat/include
12K ./bloat/lib/pkgconfig
37M ./bloat/lib
38M ./bloat
20K ./unbloat/bin
124K ./unbloat/include/google/protobuf/io
8.0K ./unbloat/include/google/protobuf/compiler/java
12K ./unbloat/include/google/protobuf/compiler/python
8.0K ./unbloat/include/google/protobuf/compiler/cpp
128K ./unbloat/include/google/protobuf/compiler
52K ./unbloat/include/google/protobuf/stubs
848K ./unbloat/include/google/protobuf
852K ./unbloat/include/google
856K ./unbloat/include
12K ./unbloat/lib/pkgconfig
15M ./unbloat/lib
16M ./unbloat
53M .

ドリルダウン:

 ls -gGh bloat/lib/
    total 37M
    -rw-r--r-- 1  13M 2010-09-07 13:57 libprotobuf.a
    -rwxr-xr-x 1  986 2010-09-07 13:57 libprotobuf.la
    -rw-r--r-- 1 1.6M 2010-09-07 13:57 libprotobuf-lite.a
    -rwxr-xr-x 1 1021 2010-09-07 13:57 libprotobuf-lite.la
    lrwxrwxrwx 1   25 2010-09-07 13:57 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   25 2010-09-07 13:57 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0
    -rwxr-xr-x 1 771K 2010-09-07 13:57 libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 13:57 libprotobuf.so -> libprotobuf.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 13:57 libprotobuf.so.6 -> libprotobuf.so.6.0.0
    -rwxr-xr-x 1 5.5M 2010-09-07 13:57 libprotobuf.so.6.0.0
    -rw-r--r-- 1  12M 2010-09-07 13:57 libprotoc.a
    -rwxr-xr-x 1 1.1K 2010-09-07 13:57 libprotoc.la
    lrwxrwxrwx 1   18 2010-09-07 13:57 libprotoc.so -> libprotoc.so.6.0.0
    lrwxrwxrwx 1   18 2010-09-07 13:57 libprotoc.so.6 -> libprotoc.so.6.0.0
    -rwxr-xr-x 1 4.6M 2010-09-07 13:57 libprotoc.so.6.0.0
    drwxr-xr-x 2 4.0K 2010-09-07 13:57 pkgconfig
    ls -gGh unbloat/lib/
    total 15M
    -rw-r--r-- 1 5.8M 2010-09-07 14:03 libprotobuf.a
    -rwxr-xr-x 1  988 2010-09-07 14:03 libprotobuf.la
    -rw-r--r-- 1 764K 2010-09-07 14:03 libprotobuf-lite.a
    -rwxr-xr-x 1 1023 2010-09-07 14:03 libprotobuf-lite.la
    lrwxrwxrwx 1   25 2010-09-07 14:03 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   25 2010-09-07 14:03 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0
    -rwxr-xr-x 1 393K 2010-09-07 14:03 libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 14:03 libprotobuf.so -> libprotobuf.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 14:03 libprotobuf.so.6 -> libprotobuf.so.6.0.0
    -rwxr-xr-x 1 2.7M 2010-09-07 14:03 libprotobuf.so.6.0.0
    -rw-r--r-- 1 3.7M 2010-09-07 14:04 libprotoc.a
    -rwxr-xr-x 1 1.1K 2010-09-07 14:04 libprotoc.la
    lrwxrwxrwx 1   18 2010-09-07 14:04 libprotoc.so -> libprotoc.so.6.0.0
    lrwxrwxrwx 1   18 2010-09-07 14:04 libprotoc.so.6 -> libprotoc.so.6.0.0
    -rwxr-xr-x 1 1.3M 2010-09-07 14:04 libprotoc.so.6.0.0
    drwxr-xr-x 2 4.0K 2010-09-07 14:03 pkgconfig

質問

--gc-sectionsリンク中に" " を実行するようにビルド スクリプトを変更していません。サイズが小さくなった原因は何ですか?

バックグラウンド

現在、gcc を使用して低レベルのライブラリをコンパイルしていますが、ライブラリは 2.5MB のストライプなしで、970KB のストリップ済みです。これは容認できず、デッド コードを削除する必要があります。OpenSSL、プロトコル バッファ、Boost の 3 つのライブラリに依存しており、最後の 2 つをライブラリに静的にリンクします。デッド コードを削除するには、静的にリンクされた 2 つのライブラリを "-ffunction-sections -fdata-sections" でコンパイルする必要があります。

関連する質問

次の質問は、デッド コードを削除するために使用するルートを指定する方法についてです。

4

2 に答える 2

1

残念ながら、ゲインは とは何の関係もありません。configure コマンド ラインで-ffunction-sections -fdata-sections指定したときにCXXFLAGS="-ffunction-sections -fdata-sections"、デフォルトのフラグであった-O2 -g -DNDEBUG. その結果、コードは最適化なしでコンパイルされました。

でテストをやり直す必要がCXXFLAGS="-ffunction-sections -fdata-sections -O2 -g -DNDEBUG"あります。そうすれば、期待される (つまり、同一の) 結果が得られます。

于 2010-09-19T08:11:49.100 に答える
1

でコンパイルすると-ffunction-sections、すべての関数が独自のセクションに発行され、すべてのオブジェクト ファイルが大きくなります (.textセクションだけではなく.text.foo.text.bar、 などがあります)。についても同じです-fdata-sections。したがって、得られた結果はまさに期待どおりです。

しかし、ビルドエリアの大きさは気にする必要はありません。気にする必要があるのは、最終的な実行可能ファイル (または共有ライブラリ) の大きさです。

指定したフラグを使用すると、「膨張」実行可能ファイルがまだ大きくなる可能性があります (ただし、おそらくそれほど大きくはありません)。を追加する-Wl,--gc-sectionsと、「膨張した」実行可能ファイルが著しく小さくなります。

于 2010-09-19T04:34:05.990 に答える