2016-09-16 224 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應用程序等,所以它靜態鏈接。能夠使用劃痕泊塢窗圖像是非常好的,我的圖像像2毫克大小。我只做靜態鏈接部署我所有的CI和dev我不打擾它 – dmportella

+0

你不能靜態鏈接'共享'庫。你可以靜態鏈接一個二進制文件,但如果你使用cgo,glibc仍然需要動態鏈接。 – JimB

+0

是啊對不起,我有cgo禁用,但我明白你的意思。 – dmportella

回答

0

這裏是另一篇博客中關於靜態編譯使用CGO圍棋程序: Linking Golang Statically

它說:

但對於這個例子中,我們只需要在「-static」標誌添加到gcc(並確保glibc-static包可用)。

這意味着您的C庫也需要靜態鏈接。

+0

是的,這正是我所做的......在我的問題中看到一行說'go install -x -buildmode = shared --ldflags'-extldflags「-static」'std'。我確實有用於安裝靜態鏈接的c運行時版本。 – wvxvw