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

Centos6 使用import lightgbm模块, 报:

将动态库对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 
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

可以看见以上导入模块时是不会报错了

这个问题就解决了

如果有用,请读者点个赞,一个小小的举手之劳你也能帮到其他人

 

 

你可能感兴趣的:(机器学习,python)