golangでビルドしたバイナリをスタティックリンク (static link)にする
スタティックリンク (static link)って何?って人はこちらをどうぞ。↓
http://wa3.i-3-i.info/word14695.html
今回はgolangでビルドしたバイナリデータをスタティックリンク (static link)にするビルド方法について書こうと思います。
(ぼくは毎回普通にビルドしてた結果、ダイナミックリンクになってました)
スタティックリンク (static link)にするビルドコマンド
$ CGO_ENABLED=0 go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"'
ビルドするときに上記コマンドでビルドすればスタティックリンク (static link)になってるはずです。
確認するときはfileコマンドを使用すれば確認できます。
file xxxx xxxx: ELF 64-bit, x86-64, version 1 (SYSV), statically linked, not stripped
ダイナミックリンクの場合は
$ file xxxx xxxx: ELF 64-bit, x86-64, version 1 (SYSV), dynamic linked, not stripped
のような表示になると思います。
ダイナミックリンク(dynamic linked)になる原因ですが
golang1.4からnetパッケージを使用してgo build
しているとダイナミックリンクになってしまうようです。
おそらく僕のプロジェクトもこれが原因でダイナミックリンク(dynamic linked)になっていたのはないかと思います。
ただ毎回
$ CGO_ENABLED=0 go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"'
なんて長ったらしいコマンドを打つのもメンドクサイので、go build
でエイリアス設定をしておくといいかもしれませんね。
まとめ
golangはバイナリデータだけで実行できるのが旨味の1つだと思うので、ビルド結果をスタティックリンク (static link)にしてバイナリデータだけで実行出来るようにしていたほうがお得だと思います。