Почти ни одна команда не работает - ошибка перемещения: символ __getrlimit, версия GLIBC_PRIVATE не определена в libc.so.6

Почти ни одна команда не работает - ошибка перемещения: символ __getrlimit, версия GLIBC_PRIVATE не определена в libc.so.6

Я подключен по 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/







Это должно сработать!

Связанный контент