Centos6 使用import lightgbm模塊, 報: "libc.so.6: version `GLIBC_2.14' not found" "Segment Fault"

這裏註明一下,轉載: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

可以看見以上導入模塊時是不會報錯了

這個問題就解決了

如果有用,請讀者點個贊,一個小小的舉手之勞你也能幫到其他人

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章