2016-09-16 160 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