Я подключен по SSH к машине, на которой у меня нет root-доступа. Чтобы что-то установить, я загрузил библиотеки со своей машины и поместил их в каталог ~/lib
удаленного хоста.
Теперь, почти при каждом запуске команды, я получаю указанную ниже ошибку (пример для ls
) или Segmentation fault (core dumped)
сообщение.
ls: relocation error: /lib/libpthread.so.0: symbol __getrlimit, version
GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
Единственные команды, которые мне удалось успешно выполнить, это cd
и pwd
до сих пор. Я могу довольно легко находить файлы в каталоге, используя TAB для автодополнения ls
, поэтому я могу перемещаться по каталогам.
uname -r
также возвращает Segmentation fault (core dumped)
сообщение, поэтому я не уверен, какую версию ядра я использую.
решение1
Поскольку вы можете войти в систему, ничего серьезного не сломалось; предположительно, скрипты запуска вашей оболочки добавляются ~/lib
в LD_LIBRARY_PATH
, и это, наряду с плохими библиотеками в ~/lib
, является причиной проблем, которые вы видите.
Чтобы исправить это, запустите
unset LD_LIBRARY_PATH
Это позволит вам запустить и т. д. rm
, vim
чтобы удалить проблемные библиотеки и отредактировать скрипты запуска, если это необходимо.
решение2
Проблема в том, что вы поместили копию glibc
в свой ~/lib
каталог, и эта библиотека несовместима с системой, в которую вы ее загрузили. Библиотека ссылается так, как ~/lib
указано в $LD_LIBRARY_PATH
.
Чтобы временно исправить это, просто unset LD_LIBRARY_PATH
- это будет работать как unset
встроенная оболочка. Затем вы сможете запустить свой любимый текстовый редактор, чтобы удалить то, что находится в ваших файлах запуска, что устанавливает переменную в первую очередь.
решение3
То, что я нашел в Linux Yocto Sumo v4.14, но должно быть идентично для всех ядер Linux:
- Вы можете переключаться между двумя версиями основных библиотек: в /lib — версия по умолчанию, а в /usr/lib — версия, установленная пользователем или добавленная к сообщению.
- Для этого просто установите переменную LD_LIBRARY_PATH в каждой команде. Или же вызовите экспорт с самого начала, т.е.
export LD_LIBRARY_PATH=/lib
# now everything should work again since there should
be a valid backup version of glibc in /lib
# try use a command again
ls ./
#if this works you can overwrite the broken version of glibc in /usr/lib
cp -faL /lib/libc.so* /usr/lib/
cp -faL /lib/libc-*so* /usr/lib/
#should be optional but for the sake of completeness, as the libc package
# installs all of the following:
# direct dependencies and are versioned using
# the same version number as glibc
cp -faL /lib/ld*.so* /usr/lib/
cp -faL /lib/libdl*.so* /usr/lib/
cp -faL /lib/libm*.so* /usr/lib/
cp -faL /lib/libnsl*.so* /usr/lib/
cp -faL /lib/libnss*.so* /usr/lib/
cp -faL /lib/librt*.so* /usr/lib/
cp -faL /lib/libutil*.so* /usr/lib/
cp -faL /lib/libpthread*.so* /usr/lib/
cp -faL /lib/libcrypt*.so* /usr/lib/
cp -faL /lib/libresolv*.so* /usr/lib/
Это должно сработать!