【问题标题】:Problems with a local installation of libc本地安装 libc 的问题
【发布时间】:2015-05-15 10:13:59
【问题描述】:

我正在尝试在一些正在工作的机器上运行 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,但出于工作/管理原因,这不是一个选项。因此,我所做的是安装本地版本的 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”时,我得到了类似的“重定位错误”。

有谁知道我如何安装一个只能由我的 Python 解释器使用而不能由其他所有东西使用的 libc 版本?

注意:我使用的 libstdc++ 是本地安装的版本。我安装它的原因与我尝试安装本地版本的 libc 的原因相同。

...

好的,我进步了一点,但还是卡住了。

如果我返回旧的 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)

所以,现在我被困住了。我不知道

  1. 为什么我的 LD_LIBRARY_PATH 设置没有强制我的新(本地)libc 使用新的(本地)ld-linux。

  2. 当我强制 libc 使用新的(本地)ld-linux 时,我应该如何处理分段错误。

【问题讨论】:

  • 为什么不将 LD_LIBRARY_PATH 作为另一个变量添加到调用的前面? IE。 LD_LIBRARY_PATH=... THEANO_FLAGS=mode=FAST_RUN,floatX=float32 python train.py 这将解决您与 ls 的问题。
  • @David K. Hess - 但是有什么理由认为我在尝试运行 train.py 时不会看到我已经遇到的错误?

标签: python glibc libc theano


【解决方案1】:

所以,我所做的是安装本地版本的 libc 并更改 .bashrc 文件中的 LD_LIBRARY_PATH 以指向它

请参阅 this answer 了解为什么这不起作用。

为什么我的 LD_LIBRARY_PATH 设置没有强制我的新(本地)libc 使用新的(本地)ld-linux。

如上述答案所述,ld-linux 在链接时被烘焙到您的可执行文件中,LD_LIBRARY_PATH 无法更改。

当我强制 libc 使用新的(本地)ld-linux 时,我应该如何处理分段错误。

LD_PRELOADing ld-linux 不能永远工作:LD_PRELOAD 被解释 ld-linux,所以你实际上是在强制两个单独的ld-linuxes 进入你的过程,这让他们俩都感到很困惑。

那么,你能做什么呢?

实际上可以在一个主机上安装两个不同版本的 glibc,我们每天都这样做。指令here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多