Ich bin per SSH mit einer Maschine verbunden, auf der ich keinen Root-Zugriff habe. Um etwas zu installieren, lade ich Bibliotheken von meiner Maschine hoch und lege sie in das ~/lib
Verzeichnis des Remote-Hosts.
Jetzt erhalte ich für fast jeden Befehl, den ich ausführe, den unten stehenden Fehler (Beispiel gilt für ls
) oder eine Segmentation fault (core dumped)
Meldung.
ls: relocation error: /lib/libpthread.so.0: symbol __getrlimit, version
GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
Die einzigen Befehle, die ich bisher erfolgreich ausführen konnte, sind cd
und . Ich kann Dateien in einem Verzeichnis im Wesentlichen finden, indem ich die TAB-Taste zur automatischen Vervollständigung verwende , sodass ich mich durch Verzeichnisse bewegen kann.pwd
ls
uname -r
gibt auch die Segmentation fault (core dumped)
Meldung zurück, daher bin ich nicht sicher, welche Kernelversion ich verwende.
Antwort1
Da Sie sich anmelden können, ist nichts Wichtiges defekt. Vermutlich tragen die Startskripte Ihrer Shell zu ~/lib
bei LD_LIBRARY_PATH
und dies ~/lib
ist zusammen mit den fehlerhaften Bibliotheken in die Ursache der Probleme, die Sie feststellen.
Um dieses Problem zu beheben, führen Sie
unset LD_LIBRARY_PATH
Auf diese Weise können Sie usw. ausführen rm
, vim
um die problematischen Bibliotheken zu entfernen und ggf. Ihre Startskripte zu bearbeiten.
Antwort2
glibc
Das Problem besteht darin, dass Sie eine Kopie von in Ihr Verzeichnis gelegt haben ~/lib
und diese Bibliothek mit dem System, auf das Sie sie hochgeladen haben, nicht kompatibel ist. Auf die Bibliothek wird wie ~/lib
in angegeben verwiesen $LD_LIBRARY_PATH
.
Um dies vorübergehend zu beheben, gehen Sie einfach wie folgt vor unset LD_LIBRARY_PATH
: Dies funktioniert, da unset
eine Shell integriert ist. Sie können dann Ihren bevorzugten Texteditor ausführen, um das zu entfernen, was in Ihren Startdateien steht und die Variable überhaupt erst festlegt.
Antwort3
Was ich zu Linux Yocto Sumo v4.14 gefunden habe, was aber für alle Linux-Kernel identisch sein sollte:
- Sie können zwischen zwei Versionen wichtiger Bibliotheken wechseln: in /lib die Standardversion und in /usr/lib die vom Benutzer installierte bzw. angehängte Version.
- Dazu muss bei jedem Befehl einfach die Variable LD_LIBRARY_PATH gesetzt werden. Alternativ kann auch export von Anfang an aufgerufen werden, d.h.
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/
Das sollte funktionieren!