Я пытаюсь запустить реализацию 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)
Итак, теперь я застрял. Я не знаю,
Почему моя установка LD_LIBRARY_PATH не заставляла мое новое (локальное) Libc использовать новый (локальный) LD-Linux.
Что я должен делать с ошибкой сегментации, когда я вынуждаю libc использовать новый (локальный) ld-linux.
Почему бы просто не добавить LD_LIBRARY_PATH к фронту вашего вызова в качестве другой переменной? То есть 'LD_LIBRARY_PATH = ... THEANO_FLAGS = mode = FAST_RUN, floatX = float32 python train.py' Это исправит вашу проблему с помощью' ls'. –
@ Давид К. Гесс. Но есть ли основания думать, что я не увижу ошибку, которую я уже получаю, когда пытаюсь запустить train.py? – user1245262