Warum gibt es „/lib“ und „/lib64“, aber nur „/bin“?

Warum gibt es „/lib“ und „/lib64“, aber nur „/bin“?

Auf meinem Laptop:

$ cat /etc/issue  
Ubuntu 18.04 LTS \n \l

Es gibt zwei verschiedene Ordner für Bibliotheken x86und 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 /libund gibt /lib64:

DerDateisystemhierarchiestandard Erwähnungen, die getrennt sind /libund /lib64existieren, 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 /libVerzeichnisse /lib64 für 32-Bit- und 64-Bit-Bibliotheken, obwohl /libes 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.6Bibliotheken in /libund /lib64.

Jeder dynamisch aufgebaute ELF-Binärdatei enthält einen fest codierten Pfad zum Interpreter, in diesem Fall entweder /lib/ld-linux.so.2oder /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=1oder einen lddWrapper 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 /libund 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 /binund 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.

verwandte Informationen