Centos6 使用 gbdt lightgbm "libc.so.6: version `GLIBC_2.14' not found" "Segment Fault"

  • 由于系统自带的libc.so.6版本过低导致,运行:strings /lib64/libc.so.6|grep GLIBC_,结果中不包含GLIBC_2.14
  • 各种转载的更新glibc的方法不靠谱,轻则运行时"Segment Fault",重则系统崩溃
  • 查看依赖GLIBC_2.14的动态库
python
>>>import lightgbm
Traceback (most recent call last):
...
OSError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/prefer/anaconda2/lib/python2.7/site-packages/lightgbm/lib_lightgbm.so)
  • 找到对应动态库
cd /home/prefer/anaconda2/lib/python2.7/site-packages/lightgbm/lightgbm
  • 查找动态库对GLIBC_2.14的调用
readelf -s lib_lightgbm.so |grep GLIBC_2.14

readelf -V lib_lightgbm.so

  • 将动态库对GLIBC_2.14的依赖降为WEAK
0x039cd8+0x00a0+0x4=0x39d7c
for addr in 0x39d7c; do printf '\x02' | dd conv=notrunc of=./lib_lightgbm.so  bs=1 seek=$((addr)) ; done
readelf -V lib_lightgbm.so

  • 自己新建lib,补充GLIBC_2.14的函数
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/prefer/anaconda2/lib/
  • 配置环境变量,重新运行python
export LD_LIBRARY_PATH=/home/prefer/anaconda2/lib:$LD_LIBRARY_PATH
export LD_PRELOAD=/home/prefer/anaconda2/lib/libc_my.so
python
>>> import lightgbm
  • 如果还是不行,重复上述步骤

参考文献:

https://www.jianshu.com/p/308a4e803c81

https://blog.csdn.net/xp5xp6/article/details/52513428

http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc

猜你喜欢

转载自www.cnblogs.com/jhc888007/p/9400450.html