1. ホーム
  2. go

[解決済み] Goのコンパイル済み実行ファイルのサイズが巨大化する理由

2022-11-07 21:27:23

質問

Hello worldというGoプログラムをコンパイルして、Linuxマシン上でネイティブの実行ファイルを生成しました。しかし、単純なHello world Goプログラムのサイズを見て驚きました、それは1.9MBでした!

なぜ、このような単純なプログラムの実行形式がこんなに巨大なのでしょうか?

どうすれば解決するのでしょうか?

この質問は、公式のFAQに掲載されているものと同じです。 なぜ私のつまらないプログラムはこんなに大きなバイナリなのですか?

答えを引用します。

<ブロッククオート

gcツールチェーンに含まれるリンカー( 5l , 6l そして 8l ) は静的リンクを行います。したがって、すべての Go バイナリには Go ランタイムと、動的な型チェック、リフレクション、さらにはパニック時のスタック トレースをサポートするために必要なランタイム型情報が含まれています。

Linux 上で gcc を使用して静的にコンパイルおよびリンクされた単純な C の "hello, world" プログラムは約 750kB で、これには、次の実装が含まれます。 printf . を使用した同等の Go プログラムは fmt.Printf を使った同等の Go プログラムは約 1.9 MB ですが、これにはより強力なランタイムサポートと型情報が含まれています。

Hello World のネイティブ実行ファイルが 1.9 MB なのは、ガベージコレクション、リフレクション、その他多くの機能 (プログラムは実際には使用しないかもしれませんが、存在します) を提供するランタイムが含まれているからです。そして fmt パッケージの実装も含まれています。 "Hello World" テキスト(とその依存関係)を印刷するために使用したパッケージです。

では、次のようにしてみてください。 fmt.Println("Hello World! Again") の行を追加して、もう一度コンパイルしてください。結果は 2x 1.9MB ではなく、まだ 1.9MB です! そうです、使用されているすべてのライブラリ ( fmt とその依存関係)とランタイムはすでに実行ファイルに追加されているからです(したがって、先ほど追加した2番目のテキストを印刷するために、さらに数バイトが追加されるだけです)。