【问题标题】:Error while using a newer version of glibc使用较新版本的 glibc 时出错
【发布时间】:2017-04-17 08:45:04
【问题描述】:

我正在尝试在 linux 服务器上安装 tensorflow,我只是一个没有 root 权限的用户。当我通过跳转服务器 ssh 到它时,我无法向/从它传输文件。系统如下:

Linux THENAME_OF_SURVER 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我通过pip install tensorflow 安装了 tensorflow,然后一个 tensorflow 程序会显示以下内容:

ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found

我安装了新版本的glibc

git clone git://sourceware.org/git/glibc.git cd glibc git checkout --track -b local_glibc-2.16 origin/release/2.16/master mkdir build cd build ../configure --prefix=/home/MYNAME/dependency/glibc-2.16 make -j4 make install

按照网上的说明,我通过以下方式更改了环境变量:

export LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib

但这给我带来了一个问题:我不能使用任何命令。例如,我打电话给ls,它会这样警告我:

ls: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

然后我按照另一条指令运行如下命令:

/home/MYNAME/dependency/glibc-2.16/lib/ld-linux-x86-64.so.2 --library-path /home/MYNAME/dependency/glibc-2.16/lib:$LD_LIBRARY_PATH:/path/to/gcc-5.2.0/lib64:/usr/lib64/:/usr/lib64/ ls (我不知道在哪里可以找到与gcc-5.2.0类似的文件夹,我的which gcc显示/usr/local/sbin/gcc,但它链接到/usr/local/gcc-5.3.0/bin/gcc,它没有lib64子文件夹)

但随后出现以下警告:

ls: error while loading shared libraries: ls: cannot open shared object file

我知道我可以通过将变量导出为空来再次使用ls。但是我还是不能使用新版本的glibc。谁能帮助我如何正确链接新的 glibc?任何建议将不胜感激!

编辑: 所以进度如下:

  1. LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib python
    将导致python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

  2. /home/MYNAME/dependency/glibc-2.16/lib/ld-2.16.so python
    将导致python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

EDIT2 和总结:

为了使 Employed Russian 的答案更详细,我将在此处粘贴我的最终解决方案。

我的目标是在我没有 root 权限的服务器上使用 Python 中的 tensorflow。我在导入 tensorflow 时被警告 ImportError: /lib64/libc.so.6: version 'GLIBC_2.16' not found

根据 Employed Russian 的回答,我使用以下命令运行我的命令:

LD_LIBRARY_PATH=/home/USERNAME/dependency/glibc-2.17/lib/:/lib64/:/usr/local/gcc-5.3.0/lib64/ /home/USERNAME/dependency/glibc-2.17/lib/ld-2.17.so /home/USERNAME/anaconda2/bin/python

将命令拆分为以下部分(我会使用??? 来表示不同人的不同路径。):

  1. LD_LIBRARY_PATH=
    • 这部分处理依赖关系
    • : 表示拆分
    • ???/glibc-2.17/lib/
    • /lib64//usr/local/gcc-5.3.0/lib64/:我是通过 find / -name 'libgcc_s.so.1' 找到这些文件夹的,因为我是
  2. /???/glibc-2.17/lib/ld-2.17.so
  3. /???/python 可执行文件的路径。对于 Python,import sys; print(sys.executable) 查看您的 Python 路径。

其他:

  1. glibc-2.17 从gnu 下载。我选择 2.17 是因为 tensorflow 需要 2.17,而 2.17 可以正常工作。
  2. 此解决方案还有另一个问题。我有时需要在 Python 中调用 shell 命令,例如 os.system('ls')os.system('python xxx.py')。但如果我以正常方式使用它,它会警告我如下:sh: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument,我还没有找到足够好的解决方案。

【问题讨论】:

  • 您是否尝试设置LD_LIBRARY_PATH 变量仅用于运行python?即运行单个命令:LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib python,然后在出现的提示符下输入import tensorflow as tf
  • @mrry 我试过了,但它仍然发出同样的警告:python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
  • @KahoChan 使用 find (find / -name 'libgcc_s.so.1') 我的权限被拒绝,我怎样才能找到找到路径的位置?谢谢

标签: linux linker tensorflow glibc


【解决方案1】:

在我的例子中,它是 centos 6 和 python for pytorch

我遇到了诸如此类的错误:

libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/evaldsu/.conda/envs/conda_env/lib/python3.6/site-

我在本地目录 /opt/exp_soft/tools 中与 glibc-2.17 一起安装

然后我在 conda env 补丁工具中安装(也可以使用其他工具安装):

conda install -c conda-forge patchelf

然后我修补了 python 的二进制文件以使用不同的 glibc 路径(您可以使用任何二进制文件执行此操作)。请注意,它会改变你的 python 二进制文件。

patchelf --set-rpath /opt/exp_soft/tools/glibc-2.17/lib:$HOME/.conda/envs/conda_inf/lib:/usr/lib64:/lib64:/lib --set-interpreter /opt/exp_soft/tools/glibc-2.17/lib/ld-linux-x86-64.so.2 /home/evaldsu/.conda/envs/conda_inf/bin/python3.6

如果您拥有完全的管理员权限,另一种选择是安装此脚本:

https://gist.github.com/harv/f86690fcad94f655906ee9e37c85b174

【讨论】:

  • 我关注了你的 GitHub 链接 [gist.github.com/harv/f86690fcad94f655906ee9e37c85b174] 一切都按预期进行,最后我得到了以下错误。 warning: glibc-2.17-55.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID 73ec361c: NOKEY error: Failed dependencies: glibc-common = 2.12-1.212.el6_10.3 is needed by (installed) glibc-2.12-1.212.el6_10.3.i686
  • 在完成上述步骤后得到RuntimeError: Couldn't start Redis. Check log files: ,日志文件显示:/lib64/libc.so.6: version GLIBC_2.14' not found`
【解决方案2】:

export LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib

This answer 解释了为什么 LD_LIBRARY_PATH 不起作用,以及您应该怎么做。

我阅读了您的帖子并尝试了...
python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

该错误通常意味着您在ld-linuxlibc.so.6 之间存在不匹配。它们必须匹配。

如果您通过/home/MYNAME/.../ld-2.16.so 使用直接加载程序调用,您还必须安排/home/MYNAME/.../libc.so.6 被加载。

您可以通过将--library-path ... 传递给ld-2.16.so 或适当地设置LD_LIBRARY_PATH 来做到这一点。

您使用ld-2.16 --library-path ... ls 的命令几乎正确。您缺少的是ld-2.16不会搜索您的PATH。您需要为其提供完整路径名:ld-2.16 --library-path ... /bin/ls

【讨论】:

  • 我阅读了您的帖子并尝试了/home/MYNAME/dependency/glibc-2.16/lib/ld-2.16.so python,但它会导致python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument。有什么遗漏的吗?
  • 谢谢!我在您的指导下解决了问题。我已经编辑了我的问题并在最后粘贴了我的详细解决方案。此解决方案的唯一问题是我无法在 Python 脚本中使用 shell 命令。
  • “你缺少的是 ld-2.16 不会搜索你的 PATH。你需要给它完整的路径名”是修复
猜你喜欢
  • 2011-05-07
  • 2020-10-12
  • 2016-05-22
  • 1970-01-01
  • 2017-12-29
  • 2013-02-02
  • 2012-06-01
  • 2013-04-03
  • 2018-07-21
相关资源
最近更新 更多