本地安装 libc 的问题
Problems with a local installation of libc
我正在尝试 运行 在某些工作机器上实现 alexNet 的 Theano 实现。当我第一次尝试 运行 时,出现以下错误:
$ THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
....
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /data1/software/analysis/libstdc++.6.0.15/usr/lib64/libstdc++.so.6)
通常情况下,我在这种情况下会使用我的包管理器来更新 libc,但由于 work/administrative 原因,这不是一个选项。因此,我所做的是安装本地版本的 libc 并更改 .bashrc 文件中的 LD_LIBRARY_PATH 以指向它。但是,现在我收到以下错误:
$ THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
python: relocation error: /data1/software/analysis/libc.2.14/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
奇怪的是,当我尝试 'ls'.
时,我得到了类似的 'relocation error'
有谁知道我如何安装一个只供我的 Python 解释器使用,而不供其他所有解释器使用的 libc 版本?
注意:我使用的libstdc++是本地安装的版本。我安装它的原因与我尝试安装本地版本的 libc 的原因相同。
...
好的,我又进步了一点,但还是卡住了。
如果我 return 到我的旧 LD_LIBRARY_PATH,为了避免像 'ls' 这样的命令出错,我可以验证新的(本地)libc 实际上,使用旧的(系统)ld-linux-x86-64.so.2
$ ldd /data1/software/analysis/libc.2.14/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x0000003b9d400000)
linux-vdso.so.1 => (0x00007fff887ff000)
所以,我想我会更改 LD_LIBRARY_PATH 以寻找新的(本地)ld-linux-x86-64.so.2
$ export LD_LIBRARY_PATH=/data1/software/analysis/libc.2.14:$LD_LIBRARY_PATH
$ ls /data1/software/analysis/libc.2.14/lib64
ld-2.14.1.so libanl-2.14.1.so libcidn.so.1
libm-2.14.1.so libnss_compat.so.2 libnss_hesiod-2.14.1.so
libnss_nisplus.so.2 librt-2.14.1.so libutil.so.1
ld-linux-x86-64.so.2 libanl.so.1 libcrypt-2.14.1.so
libm.so.6 libnss_dns-2.14.1.so libnss_hesiod.so.2
libpthread-2.14.1.so librt.so.1 rtkaio
libBrokenLocale-2.14.1.so libc-2.14.1.so libcrypt.so.1
libnsl-2.14.1.so libnss_dns.so.2 libnss_nis-2.14.1.so
libpthread.so.0 libthread_db-1.0.so
libBrokenLocale.so.1 libc.so.6 libdl-2.14.1.so
libnsl.so.1 libnss_files-2.14.1.so libnss_nis.so.2
libresolv-2.14.1.so libthread_db.so.1
libSegFault.so libcidn-2.14.1.so libdl.so.2
libnss_compat-2.14.1.so libnss_files.so.2 libnss_nisplus-2.14.1.so
libresolv.so.2 libutil-2.14.1.so
$ ldd /data1/software/analysis/libc.2.14/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x0000003b9d400000)
linux-vdso.so.1 => (0x00007fffad5ff000)
$ echo $LD_LIBRARY_PATH
/data1/software/analysis/libc.2.14:
/data1/software/analysis
/libstdc++.6.0.15/usr/lib64:/data1/software/analysis/anaconda/lib:
/data2/software/stable/CUDA/5.5.22/lib:
/data2/software/stable/CUDA/5.5.22/include:
/data2/software/stable/CUDA/5.5.22/lib64:
/data1/software/analysis/anaconda/lib:
/data2/software/stable/CUDA/5.5.22/lib:
/data2/software/stable/CUDA/5.5.22/include:
/data2/software/stable/CUDA/5.5.22/lib64:
因此,我的 libc 应该会看到新的 ld-linux-x86-64.so.2。我可以验证这是否具有符号 _dl_starting_up:
$ nm /data1/software/analysis/libc.2.14/lib64/ld-linux-x86-64.so.2 | grep _dl_start*
0000000000004c00 t _dl_start
000000000000fc30 t _dl_start_profile
0000000000001698 t _dl_start_user
0000000000220000 V _dl_starting_up
0000000000220000 b _dl_starting_up_internal
但是,当我尝试 运行 使用 LD_PRELOAD 的 alexNet 实现以保证使用正确的 libc 时,我仍然遇到相同的错误:
$ LD_PRELOAD=/data1/software/analysis/libc.2.14/lib64/libc.so.6 THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
python: relocation error: /data1/software/analysis/libc.2.14/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
为什么新的(本地)ld-linux 没有覆盖旧的(系统)ld-linux?我的 LD_LIBRARY_PATH 设置不应该解决这个问题吗?
如果我试图通过预加载 ld-linux 来强制解决这个问题,我会得到一个分段错误:
$ LD_PRELOAD=/data1/software/analysis/libc.2.14/lib64/ld-linux-x86-64.so.2:/data1/software/analysis/libc.2.14/lib64/libc.so.6 THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
Segmentation fault (core dumped)
所以,现在我卡住了。我不知道
为什么我的 LD_LIBRARY_PATH 设置没有强制我的新(本地)libc 使用新的(本地)ld-linux.
当我强制 libc 使用新的(本地)ld-linux.
时,我应该如何处理分段错误
So, what I did instead was to install a local version of libc and to change LD_LIBRARY_PATH in my .bashrc file to point to it
请参阅 this answer 了解为什么它不起作用。
Why my setting of LD_LIBRARY_PATH didn't force my new (local) libc to use the new (local) ld-linux.
正如上面的回答所解释的那样,ld-linux
在 link 时被 烘焙 到您的可执行文件中并且不能被 LD_LIBRARY_PATH
更改。
What I should do about the segmentation fault when I force libc to use the new (local) ld-linux.
LD_PRELOAD
ing ld-linux
可以 永远不会 工作:LD_PRELOAD
被 解释 ld-linux
,因此您实际上是在将两个单独的 ld-linux
es 强加到您的过程中,这极大地混淆了它们。
那么,你能做什么?
实际上可以在一台主机上安装两个不同版本的 glibc,我们每天都这样做。说明here.
我正在尝试 运行 在某些工作机器上实现 alexNet 的 Theano 实现。当我第一次尝试 运行 时,出现以下错误:
$ THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
....
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /data1/software/analysis/libstdc++.6.0.15/usr/lib64/libstdc++.so.6)
通常情况下,我在这种情况下会使用我的包管理器来更新 libc,但由于 work/administrative 原因,这不是一个选项。因此,我所做的是安装本地版本的 libc 并更改 .bashrc 文件中的 LD_LIBRARY_PATH 以指向它。但是,现在我收到以下错误:
$ THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
python: relocation error: /data1/software/analysis/libc.2.14/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
奇怪的是,当我尝试 'ls'.
时,我得到了类似的 'relocation error'有谁知道我如何安装一个只供我的 Python 解释器使用,而不供其他所有解释器使用的 libc 版本?
注意:我使用的libstdc++是本地安装的版本。我安装它的原因与我尝试安装本地版本的 libc 的原因相同。
...
好的,我又进步了一点,但还是卡住了。
如果我 return 到我的旧 LD_LIBRARY_PATH,为了避免像 'ls' 这样的命令出错,我可以验证新的(本地)libc 实际上,使用旧的(系统)ld-linux-x86-64.so.2
$ ldd /data1/software/analysis/libc.2.14/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x0000003b9d400000)
linux-vdso.so.1 => (0x00007fff887ff000)
所以,我想我会更改 LD_LIBRARY_PATH 以寻找新的(本地)ld-linux-x86-64.so.2
$ export LD_LIBRARY_PATH=/data1/software/analysis/libc.2.14:$LD_LIBRARY_PATH
$ ls /data1/software/analysis/libc.2.14/lib64
ld-2.14.1.so libanl-2.14.1.so libcidn.so.1
libm-2.14.1.so libnss_compat.so.2 libnss_hesiod-2.14.1.so
libnss_nisplus.so.2 librt-2.14.1.so libutil.so.1
ld-linux-x86-64.so.2 libanl.so.1 libcrypt-2.14.1.so
libm.so.6 libnss_dns-2.14.1.so libnss_hesiod.so.2
libpthread-2.14.1.so librt.so.1 rtkaio
libBrokenLocale-2.14.1.so libc-2.14.1.so libcrypt.so.1
libnsl-2.14.1.so libnss_dns.so.2 libnss_nis-2.14.1.so
libpthread.so.0 libthread_db-1.0.so
libBrokenLocale.so.1 libc.so.6 libdl-2.14.1.so
libnsl.so.1 libnss_files-2.14.1.so libnss_nis.so.2
libresolv-2.14.1.so libthread_db.so.1
libSegFault.so libcidn-2.14.1.so libdl.so.2
libnss_compat-2.14.1.so libnss_files.so.2 libnss_nisplus-2.14.1.so
libresolv.so.2 libutil-2.14.1.so
$ ldd /data1/software/analysis/libc.2.14/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x0000003b9d400000)
linux-vdso.so.1 => (0x00007fffad5ff000)
$ echo $LD_LIBRARY_PATH
/data1/software/analysis/libc.2.14:
/data1/software/analysis
/libstdc++.6.0.15/usr/lib64:/data1/software/analysis/anaconda/lib:
/data2/software/stable/CUDA/5.5.22/lib:
/data2/software/stable/CUDA/5.5.22/include:
/data2/software/stable/CUDA/5.5.22/lib64:
/data1/software/analysis/anaconda/lib:
/data2/software/stable/CUDA/5.5.22/lib:
/data2/software/stable/CUDA/5.5.22/include:
/data2/software/stable/CUDA/5.5.22/lib64:
因此,我的 libc 应该会看到新的 ld-linux-x86-64.so.2。我可以验证这是否具有符号 _dl_starting_up:
$ nm /data1/software/analysis/libc.2.14/lib64/ld-linux-x86-64.so.2 | grep _dl_start*
0000000000004c00 t _dl_start
000000000000fc30 t _dl_start_profile
0000000000001698 t _dl_start_user
0000000000220000 V _dl_starting_up
0000000000220000 b _dl_starting_up_internal
但是,当我尝试 运行 使用 LD_PRELOAD 的 alexNet 实现以保证使用正确的 libc 时,我仍然遇到相同的错误:
$ LD_PRELOAD=/data1/software/analysis/libc.2.14/lib64/libc.so.6 THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
python: relocation error: /data1/software/analysis/libc.2.14/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
为什么新的(本地)ld-linux 没有覆盖旧的(系统)ld-linux?我的 LD_LIBRARY_PATH 设置不应该解决这个问题吗?
如果我试图通过预加载 ld-linux 来强制解决这个问题,我会得到一个分段错误:
$ LD_PRELOAD=/data1/software/analysis/libc.2.14/lib64/ld-linux-x86-64.so.2:/data1/software/analysis/libc.2.14/lib64/libc.so.6 THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py
Segmentation fault (core dumped)
所以,现在我卡住了。我不知道
为什么我的 LD_LIBRARY_PATH 设置没有强制我的新(本地)libc 使用新的(本地)ld-linux.
当我强制 libc 使用新的(本地)ld-linux.
时,我应该如何处理分段错误
So, what I did instead was to install a local version of libc and to change LD_LIBRARY_PATH in my .bashrc file to point to it
请参阅 this answer 了解为什么它不起作用。
Why my setting of LD_LIBRARY_PATH didn't force my new (local) libc to use the new (local) ld-linux.
正如上面的回答所解释的那样,ld-linux
在 link 时被 烘焙 到您的可执行文件中并且不能被 LD_LIBRARY_PATH
更改。
What I should do about the segmentation fault when I force libc to use the new (local) ld-linux.
LD_PRELOAD
ing ld-linux
可以 永远不会 工作:LD_PRELOAD
被 解释 ld-linux
,因此您实际上是在将两个单独的 ld-linux
es 强加到您的过程中,这极大地混淆了它们。
那么,你能做什么?
实际上可以在一台主机上安装两个不同版本的 glibc,我们每天都这样做。说明here.