Erstens, warum es separate /lib
gibt und /lib64
:
Der Dateisystem-Hierarchiestandard erwähnt, dass /lib
getrennt wird und /lib64
existieren, weil:
10.1. Auf Systemen, die mehr als ein Binärformat unterstützen, kann es eine oder mehrere Varianten des /lib-Verzeichnisses geben, die separate Bibliotheken erfordern. (...) Dies wird häufig für die 64-Bit- oder 32-Bit-Unterstützung auf Systemen verwendet, die mehrere Binärformate unterstützen, aber gleichnamige Bibliotheken benötigen. In diesem Fall könnten /lib32 und /lib64 die Bibliotheksverzeichnisse sein und /lib ein symbolischer Link zu einem davon.
Auf meiner Slackware 14.2 gibt es zum Beispiel /lib
und /lib64
Verzeichnisse für 32-Bit- bzw. 64-Bit-Bibliotheken, obwohl/lib
ist kein symbolischer Link, wie das FHS-Snippet vermuten lässt:
$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib/libc.so.6 -> libc-2.23.so
$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib64/libc.so.6 -> libc-2.23.so
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
:
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
$ readelf -a main | grep 'Requesting program interpreter'
[Requesting program interpreter: /lib/ld-linux.so.2]
$ file ./main64
./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ readelf -a main64 | grep 'Requesting program interpreter'
[Requesting program interpreter: /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 mit LD_TRACE_LOADED_OBJECTS=1
auszuführen oder ein ldd
Hülle:
$ LD_TRACE_LOADED_OBJECTS=1 ./main
linux-gate.so.1 (0xf77a9000)
libc.so.6 => /lib/libc.so.6 (0xf760e000)
/lib/ld-linux.so.2 (0xf77aa000)
$ LD_TRACE_LOADED_OBJECTS=1 ./main64
linux-vdso.so.1 (0x00007ffd535b3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f568347c000)
Wie Sie sehen können, weiß ein bestimmter Interpreter genau, wo er nach Bibliotheken suchen 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 über /bin
:
/bin enthält Befehle, die sowohl vom Systemadministrator als auch von Benutzern verwendet werden können, aber erforderlich sind, wenn keine anderen Dateisysteme gemountet sind (z. B. im Einzelbenutzermodus). Es kann auch Befehle enthalten, die indirekt von Skripten verwendet werden.
IMO der Grund, warum es keine separaten /bin
gibt und /bin64
Wenn wir die Datei mit demselben Namen in beiden Verzeichnissen hätten, könnten wir eine davon nicht direkt aufrufen, weil wir /bin
eingeben müssten oder /bin64
zuerst in$PATH
.
Beachten Sie jedoch, dass das Obige nur die Konvention ist - dem Linuxkernel ist es egal, ob Sie separate /bin
haben und /bin64
.Wenn 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 - keine Glibc, keine Bash (standardmäßig können Sie es natürlich manuell kompilieren und bereitstellen) und auch die Verzeichnisstruktur ist völlig anders .
Der Grund dafür ist, dass die lib/lib64-Verzeichnisse Dateien enthalten können, die zufällig den gleichen Namen haben weil dies Bibliotheken sind, die mit verschiedenen Programmen geteilt werden. Das Ablegen in separaten Verzeichnissen löst den Konflikt. Es gibt (normalerweise...) keinen triftigen Grund, gleichnamige ausführbare Dateien auf demselben System zu verteilen, die 32/64-Bit sind, aber da es eine Mischung aus ausführbaren Dateien geben kann, müssen die gemeinsam genutzten Bibliotheken bereitgestellt werden.