這裏註明一下,轉載:http://www.cnblogs.com/jhc888007/p/9400450.html
希望爲迷茫的你能指明方向,並解決你的問題,因爲我在這裏也做了很長一段時間,但是都是有問題的,直到看了上面的那個博客,終於把問題給解決了。
是什麼造成這個問題呢??
- 由於系統自帶的libc.so.6版本過低導致,運行:strings /lib64/libc.so.6|grep GLIBC_,結果中不包含GLIBC_2.14
- 各種轉載的更新glibc的方法不靠譜,輕則運行時"Segment Fault",重則系統崩潰
- 查看依賴GLIBC_2.14的動態庫
python3的安裝實例,可以去看我的另一篇博客:https://blog.csdn.net/hjh1653267911/article/details/81637206
具體的安裝流程細節,我這裏就不在過多介紹了
實例:
python3
>>>import lightgbm
Traceback (most recent call last):
...
OSError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/hadoop/opt/jianhong_data/python3.5.3/lib/python3.5/site-packages/lightgbm/lib_lightgbm.so)
1.查看動態庫
cd /home/hadoop/opt/jianhong_data/python3.5.3/lib/python3.5/site-packages/lightgbm/
2.查找動態庫對GLIBC_2.14的調用
readelf -s lib_lightgbm.so |grep GLIBC_2.14
使用上面命令可以看到,下面的兩行:
執行命令:
readelf -V lib_lightgbm.so
將動態庫對GLIBC_2.14的依賴降爲WEAK
算法爲: offset + glibc_2.14 的地址 + 0x4 =最後的地址 注意:這裏要換成讀者自己的ip 值進行計算
我機器的例子:0x03a110+0x00a0+0x4=0x03a1b4
然後在命令行執行:
命令: for addr in 0x03a1b4 ; do printf '\x02' | dd conv=notrunc of=./lib_lightgbm.so bs=1 seek=$((addr)) ; done
再查看狀態:
readelf -V lib_lightgbm.so
此時結果就是上面那個圖的狀態了,同時flags:變爲了weak 狀態
接下來:
自己新建lib目錄,也可以使用下面的方法,同時補充GLIBC_2.14的函數
注意:這個lib目錄自己隨便選擇
mkdir libc_my
cd libc_my
vim libc_my.c
#include <string.h>
void* memcpy(void *dest, const void *src, size_t n) {
return memmove(dest, src, n);
}
gcc -s -shared -o libc_my.so -fPIC -fno-builtin libc_my.c
mv libc_my.so /home/hadoop/opt/jianhong_data/python3.5.3/lib/
然後臨時配置環境變量:
export LD_LIBRARY_PATH=/home/hadoop/opt/jianhong_data/python3.5.3/lib:$LD_LIBRARY_PATH
export LD_PRELOAD=/home/hadoop/opt/jianhong_data/python3.5.3/lib/libc_my.so
查看環境變量:
命令: printenv
重新運行python
python2.x 使用命令:
python
>>> import lightgbm
python3.x 使用命令:
python3
>>> import lightgbm
可以看見以上導入模塊時是不會報錯了
這個問題就解決了
如果有用,請讀者點個贊,一個小小的舉手之勞你也能幫到其他人