继此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代码)。
我目前正在构建我的golang应用程序等,所以它静态链接。能够使用划痕泊坞窗图像是非常好的,我的图像像2毫克大小。我只做静态链接部署我所有的CI和dev我不打扰它 – dmportella
你不能静态链接'共享'库。你可以静态链接一个二进制文件,但如果你使用cgo,glibc仍然需要动态链接。 – JimB
是啊对不起,我有cgo禁用,但我明白你的意思。 – dmportella