< >

    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"'
    

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

    备案号:苏ICP备19034936号/ 苏ICP备19034936号-1    站长邮箱:fuhuizn@163.com   版权所有

    苏公网安备 32050702010684号

    Powered by MarkdownWeb