我们在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"'
会显示一些警告,但是不影响结果。