我們在linux上編譯帶有網(wǎng)絡(luò)功能的go程序,得到的可執(zhí)行程序還是一個動態(tài)鏈接程序,依賴系統(tǒng)中的libc運行,如果部署到服務(wù)器上,還是需要保證服務(wù)器的libc版本不低于編譯平臺的libc版本,否則有可能不能運行。
要把go程序編譯成真正的靜態(tài)可執(zhí)行文件,必須把libc也靜態(tài)編譯進可執(zhí)行文件中。下面我就以glibc-2.30為例,演示一下怎么把libc靜態(tài)編譯進入go程序。
第一步、從http://ftp.gnu.org/gnu/glibc/下載源代碼glibc-2.30.tar.bz2。
第二步、編譯安裝glibc。假設(shè)glibc-2.30.tar.bz2保存在HOME/src/glibc230目錄中,目標是把編譯好的glibc安裝到/opt/glibc230中,現(xiàn)在到該目錄中執(zhí)行下面的命令:
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
到這里已經(jīng)安裝好了 glibc-2.30 ,可以在/opt/glibc230/lib目錄中看到后綴為.a的一些靜態(tài)庫。
第三步、編譯真正的靜態(tài)可執(zhí)行文件。
到你的go程序目錄中執(zhí)行命令:
go build -ldflags '-s -w -L /opt/glibc230/lib -linkmode "external" -extldflags "-static"'
會顯示一些警告,但是不影響結(jié)果。