エンジニアはこわくない

好きなように書く

golangでビルドしたバイナリをスタティックリンク (static link)にする


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

スタティックリンク (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)にしてバイナリデータだけで実行出来るようにしていたほうがお得だと思います。