
Auf 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 die gleiche sein sollte.
Antwort1
Erstens, warum es getrennte /lib
und gibt /lib64
:
DerDateisystemhierarchiestandard
Erwähnungen, die getrennt sind /lib
und /lib64
existieren, weil:
10.1. Auf Systemen, die mehr als ein Binärformat unterstützen und dafür separate Bibliotheken benötigen, kann es eine oder mehrere Varianten des Verzeichnisses /lib geben. (...) Dies wird häufig für 64-Bit- oder 32-Bit-Unterstützung auf Systemen verwendet, die mehrere Binärformate unterstützen, aber Bibliotheken mit demselben Namen 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 beispielsweise /lib
Verzeichnisse /lib64
für 32-Bit- und 64-Bit-Bibliotheken, obwohl
/lib
es sich nicht um einen symbolischen Link handelt, wie der FHS-Ausschnitt 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
.
Jeder dynamisch aufgebaute
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 soll, ohne eine Binärdatei LD_TRACE_LOADED_OBJECTS=1
oder einen ldd
Wrapper ausführen zu müssen:
$ 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, 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 besagt Folgendes über /bin
:
/bin enthält Befehle, die sowohl vom Systemadministrator als auch von Benutzern verwendet werden können, die jedoch erforderlich sind, wenn keine anderen Dateisysteme gemountet sind (z. B. im Einzelbenutzermodus). Es kann auch Befehle enthalten, die indirekt von Skripten verwendet werden.
Der Grund, warum es keine Trennung gibt /bin
, liegt meiner Meinung nach darin, dass wir, wenn wir die Datei mit dem gleichen Namen in beiden Verzeichnissen hätten, keins davon indirekt aufrufen könnten, weil wir zuerst „oder“ in /bin64
„“ einfügen müssten ./bin
/bin64
$PATH
Beachten Sie jedoch, dass es sich bei dem oben Gesagten nur um eine Konvention handelt. Dem Linux-Kernel ist es egal, ob Sie separate /bin
und haben /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, abgesehen von der Ausführung eines modifizierten Linux-Kernels, nichts mit GNU-Systemen wie Ubuntu zu tun hat – kein glibc, kein bash (standardmäßig, Sie können es natürlich manuell kompilieren und bereitstellen) und auch die Verzeichnisstruktur ist völlig anders.
Antwort2
Der Grund dafür ist, dass die lib/lib64-Verzeichnisse Dateien enthalten können, die zufällig die gleicheNameweil es sich dabei um Bibliotheken handelt, die von verschiedenen Programmen gemeinsam genutzt werden. Der Konflikt wird gelöst, indem man sie in getrennte Verzeichnisse legt. Es gibt (normalerweise...) keinen guten 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.