it-swarm-ja.com

Linuxでバイナリのサイズを減らすためのコンパイル時間の考慮事項は何ですか?

1つのユーティリティをコンパイルし、Linuxシステムでバイナリを作成しました。しかし、このバイナリのサイズは2.3 MBであり、このバイナリのサイズを減らす必要があります。バイナリにSTRIPを適用してみましたが、十分ではありません。それで、ユーティリティのコンパイル中に適用できるオプション(おそらく構成)はありますか?

お返事ありがとうございます。

1
nyk_mat

GCCを使用してコンパイルしている場合は、-osフラグを使用できます。あなたはここでそれを見つけることができます GCCフラグページ -

-Os
    Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

    -Os disables the following optimization flags:

              -falign-functions  -falign-jumps  -falign-loops 
              -falign-labels  -freorder-blocks  -freorder-blocks-and-partition 
              -fprefetch-loop-arrays

何らかの理由でmustにこれらのフラグがある場合は、これは適切ではありません。さらに、サイズのパフォーマンスが低下します

実行可能圧縮 のさまざまな方法を使用することもできます px のように、コンパイル後に実行可能サイズを小さくします。これはパフォーマンスとサイズのトレードオフでもありますが(かなり最小限ですが)、使用する最適化に加えて使用できます。ここでのサイズの縮小はかなり劇的なものになる可能性があります。

3
Journeyman Geek

次の方法を使用して、実行可能ファイルのサイズを減らすことができます。

  • 実行可能ファイルがデバッグシンボルなしでコンパイルされていることを確認してください。これは、メイクファイルのgccコマンドラインオプションにフラグ-gが存在する場合に発生します。このような実行可能ファイルを簡単にデバッグできるため、これは通常デフォルトです。ユーティリティstripを使用して、既存の実行可能ファイルからデバッグシンボルを削除できます。多くの場合、これだけで実行可能ファイルのサイズを2倍以上、場合によっては10倍も減らすことができます。
  • 必要なすべてのライブラリを動的にコンパイルします(特にLinuxのCランタイムライブラリglibc)。静的コンパイル(-s)は依存関係を回避するのに適していますが、実行可能ファイルのサイズが大幅に増加するという代償を伴います。たとえば、実行可能ファイルにlibxml2が必要な場合は、-lxml2gccコマンドラインに追加して、libxml2を動的にリンクします。このアプローチの欠点は、必要なライブラリがターゲットシステムにインストールされていない場合、実行可能ファイルがクラッシュすることです(最初にSudo apt-get install libxml2を実行する必要があります)。
  • サイズ-Osによる最適化を有効にします。ただし、通常のゲインは非常に小さく、5%〜10%を超えることはめったにありません。
  • upx を使用して実行可能ファイルを圧縮します(Sudo apt-get install upx-uclを使用してインストールします)。 upxは、Intelプラットフォームだけでなく、arm、mips、powerpcなどの他の多くのプラットフォームのパッキングをサポートします。upxはサイズを大幅に縮小する可能性がありますが(2x-5x)、盲目的に使用しないでください。標準の実行可能ファイルとは異なり、upxで圧縮された実行可能ファイルは同じキャッシュページを共有できません。たとえば、プログラムのサイズが2MBで、100コピーを開始した場合、約2MBのメモリしか消費しません。カーネルはキャッシュされたページを再利用します。 upxで圧縮して1MBとすると、100コピーを開始すると、200MBのメモリが消費されます。ただし、ディスクから1 MBを読み取るだけで済み、upxの解凍が非常に高速であるため(ディスクからの読み取りよりもはるかに高速)、最初のコピーの開始時間が大幅に短縮されます。
1
mvp