GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum gibt es `/lib` und `/lib64` aber nur `/bin`?

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.


Linux
  1. Warum wird der Dateideskriptor nur einmal geöffnet und gelesen?

  2. Auf dem Gerät ist kein Speicherplatz mehr vorhanden, aber die Partition ist nur halb voll und Inodes sind verfügbar

  3. Warum sind gemeinsam genutzte Bibliotheken unter Linux ausführbar?

  4. Warum ist timer_t in time.h unter Linux definiert, aber nicht unter OS X

  5. Warum und wie sind einige gemeinsam genutzte Bibliotheken lauffähig, als wären sie ausführbar?

Linux – Warum sind wahr und falsch so groß?

Wie teilt man eine monolithische Partition in zwei, eine für `/` und eine für `/home`??

Warum sind einige Emoji B&W und andere zu groß?

Gibt es ein Dateisystem, das nur eine Kopie einer Datei behält und andere Kopien nur Referenzen sind?

Warum wird von df und du eine Diskrepanz bei der Festplattennutzung gemeldet?

Warum sind wahr und falsch so groß?