2015-03-13 10 views
1

Я пытаюсь запустить реализацию aanoNet Anano на некоторых машинах на работе. Когда я первый попытался запустить его, я получил следующее сообщение об ошибке:Проблемы с локальной установкой libc

$ 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 и изменил LD_LIBRARY_PATH в моем файле .bashrc, чтобы указать на нее. Теперь, однако, я получаю следующее сообщение об ошибке:

$ 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».

Кто-нибудь знает, как я могу установить версию libc, которая будет использоваться только моим интерпретатором Python, но не всем остальным?

Примечание: 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 искать новый (местный) ЛД-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 

Но, когда я пытаюсь запустить реализацию alexNet с использованием LD_PRELOAD, чтобы гарантировать использование правой 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 позаботиться об этом?

Если я пытаюсь форсировать, по поджимать ЛД-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.

+0

Почему бы просто не добавить LD_LIBRARY_PATH к фронту вашего вызова в качестве другой переменной? То есть 'LD_LIBRARY_PATH = ... THEANO_FLAGS = mode = FAST_RUN, floatX = float32 python train.py' Это исправит вашу проблему с помощью' ls'. –

+0

@ Давид К. Гесс. Но есть ли основания думать, что я не увижу ошибку, которую я уже получаю, когда пытаюсь запустить train.py? – user1245262

ответ

1

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является запеченный в исполняемый во время ссылки и не может быть изменен LD_LIBRARY_PATH.

What I should do about the segmentation fault when I force libc to use the new (local) ld-linux.

LD_PRELOAD ИНГ ld-linuxможет никогда работа: LD_PRELOAD интерпретируется поld-linux, так что вы фактически принуждая два отдельных ld-linux эс в процесс, и что сильно путает их обоих.

Итак, что вы можете сделать?

На самом деле можно установить две отдельные версии glibc на одном хосте, мы делаем это каждый день. Инструкции here.