在blog post之后,我尝试编译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程序并将它们放入Docker镜像中。静态链接Go可执行文件需要很长时间(大约一分钟,给予或花费20秒),所以我希望将所有不经常更改的依赖项编译到共享库中,同时只重新编译应用程序的实际代码(这将减少编译时间从大约10分钟到几秒钟)。我也不想在某些Linux映像上使用Docker映像(这将使它们超过600 MB MB,而只有60 MB的Go代码)。
答案 0 :(得分:0)
这是另一篇关于静态编译使用CGo的Go程序的博文: Linking Golang Statically
它说:
但是对于那个例子,我们只需要在gcc中添加'-static'标志(并确保 glibc-static 包可用)。
意味着您的C库也需要静态链接。