Golang 开发者编程随笔Go

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

2020-03-04  本文已影响0人  从火星来

我们在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"'

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

上一篇 下一篇

猜你喜欢

热点阅读