現(xiàn)有的其他方法:
- docker容器部署:由于需要打包鏡像拔莱,每次更新包都比較大碗降,且費時
- docker容器安裝:需要在本地安裝docker,并安裝服務(wù)器對應(yīng)的linux版本鏡像塘秦,然后在里面安裝gcc等工具集讼渊,缺點是比較占用空間,且每次重啟后需要編譯的話需要啟動docker容器尊剔,費時爪幻。
- 升級服務(wù)器gcc版本:例如debian系的gcc相對與arch系gcc版本要舊,只能自己重新編譯,而且貿(mào)然升級服務(wù)器的gcc版本挨稿,可能會導(dǎo)致各種問題仇轻,風險極大。
一直以來都沒有什么好的方法解決libc庫不兼容的問題奶甘。后面找到了這個方法篷店,經(jīng)過測試,應(yīng)用可以正常運行臭家,步驟如下(以打包程序xxx.bin
為例):
1. 準備工作
- 在服務(wù)器上疲陕,或者跟服務(wù)器glibc同一個(或者稍舊)版本的docker linux容器里面編譯
patchelf
git clone https://github.com/NixOS/patchelf.git
# 網(wǎng)速慢的話可以在github的鏡像站上面下載
./bootstrap.sh
./configure
make
sudo make install
2. 打包依賴庫
- 拷貝動態(tài)庫的腳本
copylib.sh
如下,執(zhí)行copylib.sh xxx.bin
將程序所需依賴復(fù)制到當前路徑的lib
文件夾下面
#!/bin/bash
# copylib.sh
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
mkdir $LibDir
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
3. 修改elf的interpreter和dynamic loader (“ELF interpreter”)
- 將上述程序
lib
文件夾拷貝到xxx.bin
同級目錄钉赁,修改elf的腳本如下modify-elf.sh
蹄殃,執(zhí)行modify-elf.sh xxx.bin
,將程序依賴修改為上述拷貝的依賴你踩,執(zhí)行程序后發(fā)現(xiàn)沒有提示錯誤了诅岩,可以運行。
#!/bin/bash
patchelf --set-rpath `pwd`/lib $1
patchelf --set-interpreter `pwd`/lib/ld-linux-x86-64.so.2 $1