CentOS6无权限下解决__vdso_clock_gettime符号未定义的GLIBC报错
__vdso_clock_gettime relocation错误 首先咱们先把问题根源捋清楚:你之前把新版glibc装到个人目录后,大概率是修改了LD_LIBRARY_PATH环境变量,让系统优先加载你个人目录里的glibc。但系统自带的librt.so.1(版本2.12)依赖旧版glibc的私有符号__vdso_clock_gettime,而新版glibc没有这个私有符号,直接导致了链接错误。
第一步:确认程序实际加载的库路径
先搞明白conda/python到底在调用哪个libc.so.6和librt.so.1,执行这条命令就能一目了然:
ldd /public/home/liuxs/anaconda3/bin/python | grep -E "(libc.so.6|librt.so.1)"
如果输出里出现你个人目录的glibc路径,那就能实锤是环境变量导致的库优先级混乱问题。
解决方案(按优先级尝试)
1. 重置环境变量,恢复系统库优先级
首先检查你的~/.bashrc、~/.bash_profile这类登录配置文件,有没有添加过类似下面的行:
export LD_LIBRARY_PATH=/你的个人glibc目录/lib:$LD_LIBRARY_PATH
把这些行注释掉或者直接删除,然后重新登录终端,或者临时执行以下命令快速恢复:
# 清空LD_LIBRARY_PATH,让系统使用默认库路径 unset LD_LIBRARY_PATH # 或者手动指定系统默认库路径,确保优先级最高 export LD_LIBRARY_PATH=/lib64:/lib:$LD_LIBRARY_PATH
之后再测试conda和python命令,看是否恢复正常。
2. 强制让conda使用自带的兼容库
如果重置环境变量没用,说明可能有残留的链接缓存,可以强制让conda加载自己sysroot目录下的CentOS 6兼容库:
- 先临时测试是否有效:
LD_PRELOAD=/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/libc.so.6:/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/librt.so.1 /public/home/liuxs/anaconda3/bin/python
如果这条命令能正常进入python交互环境,就把这个设置永久化:
编辑~/.bashrc,添加以下别名配置:
alias python='LD_PRELOAD=/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/libc.so.6:/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/librt.so.1 /public/home/liuxs/anaconda3/bin/python' alias conda='LD_PRELOAD=/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/libc.so.6:/public/home/liuxs/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/lib/librt.so.1 /public/home/liuxs/anaconda3/bin/conda'
执行source ~/.bashrc让设置生效,之后直接用python和conda命令即可。
3. 重装Anaconda到干净环境
如果上面的方法都解决不了,建议备份当前的anaconda目录后删除,重新下载适配CentOS 6的Anaconda版本(注意选择标注cos6的安装包),安装时不要修改任何系统库相关的配置,安装完成后直接使用,彻底避免和之前手动安装的glibc产生冲突。
后续避坑提示:个人目录安装glibc的正确姿势
以后如果确实需要新版本glibc,千万不要全局修改LD_LIBRARY_PATH,可以用以下两种方式隔离,避免影响系统其他程序:
- 仅在运行特定程序时临时加载个人glibc:
LD_LIBRARY_PATH=/你的个人glibc/lib:/你的个人glibc/lib64 ./your_target_program
- 用
patchelf工具修改程序的rpath,让它优先加载个人目录的库(完全不影响其他程序):
patchelf --set-rpath /你的个人glibc/lib:/你的个人glibc/lib64 ./your_target_program
内容的提问来源于stack exchange,提问作者Shixiang Wang

