go语言编译真正的静态可执行文件

我们在linux上编译带有网络功能的go程序,得到的可执行程序还是一个动态链接程序,依赖系统中的libc运行,如果部署到服务器上,还是需要保证服务器的libc版本不低于编译平台的libc版本,否则有可能不能运行。

要把go程序编译成真正的静态可执行文件,必须把libc也静态编译进可执行文件中。下面我就以glibc-2.30为例,演示一下怎么把libc静态编译进入go程序。

第一步、从http://ftp.gnu.org/gnu/glibc/下载源代码glibc-2.30.tar.bz2

第二步、编译安装glibc。假设glibc-2.30.tar.bz2保存在HOME/src/glibc230目录中,目标是把编译好的glibc安装到/opt/glibc230中,现在到该目录中执行下面的命令:

sudo mkdir /opt/glibc230
tar xvfj glibc-2.30.tar.bz2
#在 ubuntu18.04 中使用下面的命令配置 Makefile
./glibc-2.30/configure --prefix=/opt/glibc230 
#在 ubuntu19.10 中使用下面的命令配置 Makefile
./glibc-2.30/configure --prefix=/opt/glibc230 --enable-cet
make
sudo make install

到这里已经安装好了 glibc-2.30 ,可以在/opt/glibc230/lib目录中看到后缀为.a的一些静态库。

第三步、编译真正的静态可执行文件。

到你的go程序目录中执行命令:

go build -ldflags '-s -w -L /opt/glibc230/lib -linkmode "external" -extldflags "-static"'

会显示一些警告,但是不影响结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容