In meinem Laptop:
$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
Es gibt zwei verschiedene Ordner für Bibliotheken x86
und x86_64
:
~$ ls -1 /
bin
lib
lib64
sbin
...
Warum gibt es für Binärdateien nur ein Verzeichnis?
PS Ich interessiere mich auch für Android, aber ich hoffe, dass die Antwort dieselbe sein sollte.
linux
android
architecture
Gluttton
quelle
quelle
/bin
und/sbin
dort. Was ist die Frage? Fragen Sie nach dem Unterschied zwischen/lib
und/lib64
?x86_64
(weder für/bin
nein für/sbin
)./bin64
.wine*32
undwine*64
) enthält.Antworten:
Erstens, warum gibt es separate
/lib
und/lib64
:Der Dateisystem-Hierarchie-Standard erwähnt, dass getrennt
/lib
und/lib64
vorhanden sind, weil:Auf meinem Slackware 14.2 zum Beispiel gibt es
/lib
und/lib64
Verzeichnisse für 32-Bit- und 64-Bit - Bibliotheken jeweils obwohl/lib
nicht als Symlink wie die FHS würde vorschlagen Snippet:Es gibt zwei
libc.so.6
Bibliotheken in/lib
und/lib64
.Jede dynamisch erstellte ELF-Binärdatei enthält einen fest codierten Pfad zum Interpreter. In diesem Fall entweder
/lib/ld-linux.so.2
oder/lib64/ld-linux-x86-64.so.2
:Die Aufgabe des Interpreters besteht darin, die erforderlichen gemeinsam genutzten Bibliotheken zu laden. Sie können einen GNU-Interpreter fragen, welche Bibliotheken er laden würde, ohne eine Binärdatei
LD_TRACE_LOADED_OBJECTS=1
oder einenldd
Wrapper auszuführen:Wie Sie sehen können, weiß ein bestimmter Interpreter genau, wo nach Bibliotheken gesucht werden muss. Die 32-Bit-Version sucht nach Bibliotheken in
/lib
und die 64-Bit-Version sucht nach Bibliotheken in/lib64
.Der FHS-Standard sagt Folgendes aus
/bin
:IMO ist der Grund , warum es nicht getrennt ist
/bin
und/bin64
dass , wenn wir die Datei mit dem gleichen Namen in beiden Verzeichnissen haben wir nicht einen von ihnen indirekt nennen könnten , weil wir setzen müssten/bin
oder/bin64
zuerst in$PATH
.Beachten Sie jedoch, dass dies nur die Konvention ist - dem Linux-Kernel ist es egal, ob Sie separate
/bin
und verwenden/bin64
. Wenn Sie sie möchten, können Sie sie erstellen und Ihr System entsprechend einrichten.Sie haben auch Android erwähnt - beachten Sie, dass es außer dem Ausführen eines modifizierten Linux-Kernels nichts mit GNU-Systemen wie Ubuntu zu tun hat - kein glibc, kein bash (standardmäßig können Sie es natürlich manuell kompilieren und bereitstellen) und auch die Verzeichnisstruktur ist ganz anders.
quelle
ls -l
Beispiele sind nicht besonders wichtig. Was nützlich wäre , ist die Ausgabe vonls -l /lib /lib64
, was wahrscheinlich zeigt, dass es sich/lib
selbst um einen Symlink handelt.ls -ld
, und nein,/lib
ist kein Symlink auf meinemSlackware 14.2
System.dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6
,987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6
.Der Grund dafür ist, dass die lib / lib64-Verzeichnisse Dateien enthalten können, die zufällig den gleichen Namen haben, da dies Bibliotheken sind, die mit verschiedenen Programmen gemeinsam genutzt werden. Indem Sie sie in separate Verzeichnisse stellen, wird der Konflikt gelöst. Es gibt (normalerweise ...) keinen guten Grund, gleichnamige ausführbare Dateien auf demselben System zu verteilen, die 32/64-Bit sind. Da es jedoch eine Mischung aus ausführbaren Dateien geben kann, müssen die gemeinsam genutzten Bibliotheken bereitgestellt werden.
quelle