静态链接stdlib.so

时间:2016-09-16 08:11:12

标签: go build static-libraries

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代码)。

1 个答案:

答案 0 :(得分:0)

这是另一篇关于静态编译使用CGo的Go程序的博文: Linking Golang Statically

它说:

  

但是对于那个例子,我们只需要在gcc中添加'-static'标志(并确保 glibc-static 包可用)。

意味着您的C库也需要静态链接。