

我们在linux上编译带有网络功能的go程序,得到的可执行程序还是一个动态链接程序,依赖系统中的libc运行,如果部署到服务器上,还是需要保证服务器的libc版本不低于编译平台的libc版本,否则有可能不能运行。
要把go程序编译成真正的静态可执行文件,必须把libc也静态编译进可执行文件中。下面我就以glibc-2.30为例,演示一下怎么把libc静态编译进入go程序。
第一步、从http://ftp.gnu.org/gnu/glibc/下载源代码glibc-2.30.tar.bz2。
第二步、编译安装glibc(也可以使用系统自带的静态libc库)。假设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 -extldflags "-static"'
如果使用系统自带的静态libc库,则不需要使用参数-L /opt/glibc230/lib。