go語言編譯真正的靜態(tài)可執(zhí)行文件

我們在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é)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容