2016-09-16 2 views
0

これに続いてblog post私はstdlib.soをコンパイルして、他のコードとリンクしようとしました。残念ながら、それ自体が動的にリンクされたバイナリであるstdlib.so:静的にリンクstdlib.so

# ldd /usr/local/go/pkg/linux_amd64_dynlink/libstd.so 
ldd: warning: you do not have execution permission for `/usr/local/go/pkg 
/linux_amd64_dynlink/libstd.so' 
    linux-vdso.so.1 (0x00007ffd611d7000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f82bb2c5000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f82baf04000) 
    /lib64/ld-linux-x86-64.so.2 (0x000055e99ffd7000) 

私は異なるフラグでそれを構築しようとしたが、それは私が期待される何も/ない結果を行うにはいないようです。私。私は試してみた:

go install -x -buildmode=shared --ldflags '-extldflags "-static"' std 

たとえば、しかし、それは誤ったコンパイル/リンク命令セットになるため、libstd.soは生成されません。

理由

私は私が構築し、ドッカー画像にそれらを配置する必要があり、いくつかの囲碁プログラムを持っているので、私はこれをしたいです。 Go実行可能ファイルを静的にリンクするには長い時間がかかります(約20分かかります)。まれに変化するすべての依存関係を共有ライブラリにコンパイルし、アプリケーションの実際のコードを再コンパイルするだけで約10分から数秒までのコンパイル時間)。私はまた、いくつかのLinuxイメージでDockerイメージをベースにする必要がないようにしたいと考えています(これは600 MB以上の大きさと60 MBのGoコードのみになります)。ここで

+0

私は現在、静的にリンクされているので、私のgolangアプリなどをすべてビルドしています。スクラッチドッカー画像を使用できるようにするのはとても良いことです。私の画像は2mgのサイズです。私は静的にすべての私のCIとdevに私はそれを気にしない展開の静的リンクを行う – dmportella

+0

あなたは静的に '共有'ライブラリをリンクすることはできません。静的にバイナリをリンクすることはできますが、cgoを使用している場合はglibcを動的にリンクする必要があります。 – JimB

+0

ええ、申し訳ありませんが、私は病気を無効にしているが、私はあなたが意味するものを得る。 – dmportella

答えて

0

が静的​​CGOを使用囲碁プログラムのコンパイルについては、別のブログ記事である: Linking Golang Statically

それは言う:

しかし、例えば、私達はちょうどに「-static」フラグを追加する必要がありますgcc(glibc-staticパッケージが利用可能であることを確認してください)。

これは、Cライブラリを静的にリンクする必要があることを意味します。

+0

はい、それはまさに私がやったことです。私の質問で 'go install -x -buildmode = shared --ldflags '-extldflags" -static "std'という行を見てください。私はインストールされた静的リンクのためのcランタイムのバージョンを持っています。 – wvxvw

関連する問題