enthüllt, dass es in ist /lib/i386-linux-gnu/libc.so.6, aber ein Skript, das ich ausgeführt habe, erwartete, dass es direkt darunter /libist. Warum gibt es also nicht mindestens einen Symlink?
Würde ich das Risiko eingehen, etwas zu beschädigen, wenn ich dort einen Symlink platziere?
libc.sowurde im Rahmen der Multiarch- Arbeit in Ubuntu 11.04 verschoben . Der Grund, warum es dort keinen Symlink geben kann, ist, dass der Zweck von multiarch darin besteht, die gleichzeitige Installation der Versionen i386und amd64von libczu ermöglichen, damit Sie 32-Bit-Binärdateien auf 64-Bit-Systemen und einfacher ausführen können umgekehrt (und in anderen ähnlichen Situationen). Wenn das libc6Paket einen Symlink zum neuen Speicherort enthält, können die Versionen dieses Pakets für verschiedene Architekturen nicht gleichzeitig installiert werden (welche Version des Symlinks würde dpkgausgewählt?), Wodurch der gesamte Punkt der Übung verloren geht.
Alles, was den Pfad fest codiert, libc.somuss aktualisiert werden, damit es ab Ubuntu 11.04 richtig funktioniert. Wenn das Skript, von dem Sie sprechen, Teil von Ubuntu ist, melden Sie bitte einen Fehler und fügen Sie das multiarchTag hinzu.
Schöne Antwort, heute (wieder) etwas Neues gelernt :)
Lekensteyn
1
Der von mir verwendete Prozessor unterstützt nicht einmal 64-Bit-Anweisungen. Würden Sie sagen, dass mit dem manuellen Hinzufügen eines Symlinks ein Risiko verbunden ist? Ich bin mir nicht sicher, ob ich das tun muss, aber wenn. Jedenfalls scheint dies die richtige Antwort zu sein. Vielen Dank.
Erik B
@Erik B: was? Wollen Sie mir sagen, dass Sie versuchen, eine 64-Bit-App auf einem 32-Bit-Prozessor zu verwenden? Das wird definitiv nicht funktionieren. 32-Bit-Apps funktionieren problemlos auf einem 64-Bit-Prozessor, aber nicht umgekehrt.
Lekensteyn
@Lekensteyn das ist definitiv nicht was ich sage. Was ich sage ist, dass ich keine Verwendung für die 64-Bit-Bibliothek habe. Auf meinem speziellen System wird es also keine Verwirrung darüber geben, ob /lib/libc.so.6es sich um eine 32- oder 64-Bit-Bibliothek handelt.
Erik B
3
Wenn Sie niemals 64-Bit-Pakete verwenden, besteht meines Erachtens kein nennenswertes Risiko, einen Symlink hinzuzufügen. Nein.
Colin Watson
10
Dynamische Bibliotheken werden vom Kernel geladen, die Pfade werden in einem Programm nicht fest codiert. Ein Programm sagt nur "Ich brauche libc.so.6". Das System sucht dann in Bibliothekspfaden, wie in /etc/ld.so.confeinschließlich /usr/libund /libstandardmäßig definiert. Diese Datei enthält zusätzliche Konfigurationsdateien in /etc/ld.so.conf.d.
Auf meinem 64-Bit-System libc.so.6kann /lib/x86_64-linux-gnu/libc.so.6aufgrund des Pfades in gefunden werden /etc/ld.so.conf.d/x86_64-linux-gnu.conf:
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
Um herauszufinden, welche Bibliothek von einem Programm geladen wird, verwenden Sie lddwie folgt ldd /bin/bash:
Das Setzen des Symlinks würde nichts kaputt machen, aber es würde auch nichts Gutes bewirken, oder?
Erik B
@Erik B: Auf welches Programm / Skript beziehen Sie sich? Ich kann verstehen, dass ein Skript verwirrt wird, weil der Pfad fest codiert ist. Aber ein Programm muss den Pfad nicht kennen.
Lekensteyn
Funktioniert das so? Ich habe anscheinend manchmal Probleme, bei denen Programme installierte Bibliotheken nicht finden können /usr/local/lib, aber sie funktionieren einwandfrei, wenn ich einen Symlink von hier aus erstelle /usr/lib. Was verursacht dieses Verhalten?
crazy2be
@ crazy2be: kannst du die ausgabe von posten ldconfig -v -N | grep '^/'?
Lekensteyn
@Lekensteyn: Sicher: pastebin.com/dtfnw2Tv . Es ist jedoch mit einigen Programmen auf fast jedem System passiert, das ich verwendet habe, also nahm ich an, dass es nicht mit der Systemkonfiguration zusammenhängt.
crazy2be
5
Fügen Sie der libc.so.6-Datei einfach einen Symlink wie folgt hinzu:
Das gleiche gilt für andere fehlende Dateien, die noch auf dem System vorhanden sind. In meinem Fall hat Matlab die Datei nicht gefunden. Das Problem ist jetzt behoben.
/lib/libc.so.6
es sich um eine 32- oder 64-Bit-Bibliothek handelt.Dynamische Bibliotheken werden vom Kernel geladen, die Pfade werden in einem Programm nicht fest codiert. Ein Programm sagt nur "Ich brauche libc.so.6". Das System sucht dann in Bibliothekspfaden, wie in
/etc/ld.so.conf
einschließlich/usr/lib
und/lib
standardmäßig definiert. Diese Datei enthält zusätzliche Konfigurationsdateien in/etc/ld.so.conf.d
.Auf meinem 64-Bit-System
libc.so.6
kann/lib/x86_64-linux-gnu/libc.so.6
aufgrund des Pfades in gefunden werden/etc/ld.so.conf.d/x86_64-linux-gnu.conf
:Um herauszufinden, welche Bibliothek von einem Programm geladen wird, verwenden Sie
ldd
wie folgtldd /bin/bash
:Das Setzen des Symlinks würde nichts kaputt machen.
Führen Sie Folgendes aus, um eine Liste der durchsuchten Verzeichnisse zu erhalten:
-v
Bewirkt, dass eine Liste mit Dateien und Verzeichnissen angezeigt wird, und-N
verhindert , dass der Cache (/etc/ld.so.cache
) neu erstellt wird.quelle
/usr/local/lib
, aber sie funktionieren einwandfrei, wenn ich einen Symlink von hier aus erstelle/usr/lib
. Was verursacht dieses Verhalten?ldconfig -v -N | grep '^/'
?Fügen Sie der libc.so.6-Datei einfach einen Symlink wie folgt hinzu:
Das gleiche gilt für andere fehlende Dateien, die noch auf dem System vorhanden sind. In meinem Fall hat Matlab die Datei nicht gefunden. Das Problem ist jetzt behoben.
quelle