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

27

In 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 dieselbe sein sollte.

Gluttton
quelle
1
Nur in einem? Ich sehe beide /binund /sbindort. Was ist die Frage? Fragen Sie nach dem Unterschied zwischen /libund /lib64?
Kusalananda
2
@Kusalananda, ich meine, es gibt keinen unabhängigen Ordner für x86_64(weder für /binnein für /sbin).
Gluttton
7
IMO OP will wissen, warum es keine gibt /bin64.
Arkadiusz Drabczyk
Die ungefähr eine Anwendung, die von der 32-Bit- und der 64-Bit-Version (WINE) profitiert, umgeht dies, indem sie Binärdateien mit unterschiedlichen Namen ( wine*32und wine*64) enthält.
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Es muss auch gesagt werden, dass Sie Binärdateien gegen Bibliotheken verknüpfen, nicht umgekehrt. Daher müssen Binärdateien nicht nach 32/64-Bit partitioniert werden.
smci

Antworten:

25

Erstens, warum gibt es separate /libund /lib64:

Der Dateisystem-Hierarchie-Standard erwähnt, dass getrennt /libund /lib64vorhanden sind, weil:

10.1. Es kann eine oder mehrere Varianten des Verzeichnisses / lib auf Systemen geben, die mehr als ein Binärformat unterstützen, für das separate Bibliotheken erforderlich sind. (...) Dies wird normalerweise für die 64-Bit- oder 32-Bit-Unterstützung auf Systemen verwendet, die mehrere Binärformate unterstützen, jedoch Bibliotheken mit demselben Namen erfordern. In diesem Fall sind / lib32 und / lib64 möglicherweise die Bibliotheksverzeichnisse und / lib ein Symlink zu einem dieser Verzeichnisse.

Auf meinem Slackware 14.2 zum Beispiel gibt es /libund /lib64 Verzeichnisse für 32-Bit- und 64-Bit - Bibliotheken jeweils obwohl /libnicht als Symlink wie die FHS würde vorschlagen Snippet:

$ 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.

Jede dynamisch erstellte 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 würde, ohne eine Binärdatei LD_TRACE_LOADED_OBJECTS=1oder einen lddWrapper auszuführen:

$ 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 nach Bibliotheken gesucht werden muss. Die 32-Bit-Version sucht nach Bibliotheken in /libund die 64-Bit-Version sucht nach Bibliotheken in /lib64.

Der FHS-Standard sagt Folgendes aus /bin:

/ bin enthält Befehle, die sowohl vom Systemadministrator als auch von Benutzern verwendet werden können, jedoch erforderlich sind, wenn keine anderen Dateisysteme eingehängt sind (z. B. im Einzelbenutzermodus). Es kann auch Befehle enthalten, die indirekt von Skripten verwendet werden.

IMO ist der Grund , warum es nicht getrennt ist /binund /bin64dass , 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 /binoder /bin64zuerst in $PATH.

Beachten Sie jedoch, dass dies nur die Konvention ist - dem Linux-Kernel ist es egal, ob Sie separate /binund 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.

Arkadiusz Drabczyk
quelle
Ihre ls -lBeispiele sind nicht besonders wichtig. Was nützlich wäre , ist die Ausgabe von ls -l /lib /lib64, was wahrscheinlich zeigt, dass es sich /libselbst um einen Symlink handelt.
chrylis -on strike-
Sie meinten ls -ld, und nein, /libist kein Symlink auf meinem Slackware 14.2System.
Arkadiusz Drabczyk
Bibliotheken haben unterschiedliche MD5-Summen: dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6, 987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6.
Arkadiusz Drabczyk
2
In diesem Fall wird beim Anzeigen der Symlinks im Verzeichnis keine Verbindung zum Zitat hergestellt.
chrylis -on strike-
1
LD_TRACE_LOADED_OBJECTS = 1 ist aufgrund einer Sicherheitslücke veraltet und wird von ldd nicht mehr verwendet. Grund: ldd / path / to / dangerous-static-binary wurde verwendet, um Systeme zu übernehmen, da Sysadmins erwarteten, dass ldd nur die Binärdatei ansieht und sie nicht ausführt. Die Überprüfung auf Statik oder Nicht-Statik ist ebenfalls unzureichend, da eine Binärdatei so konstruiert werden kann, dass stattdessen ein böswilliger Loader verwendet wird.
Joshua
22

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.

Thomas Dickey
quelle