Warum sind gemeinsam genutzte Bibliotheken unter Linux ausführbar?

8

Ich bin nur Neugierig.

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'

Alles scheint gut zu funktionieren, nur mit + r. Mir ist aufgefallen, dass die meisten .so in / usr / lib + x gesetzt haben ...

Warum sollen gemeinsam genutzte Bibliotheken ein ausführbares Bit gesetzt haben? Was könnte passieren, wenn ich es nicht einstelle?

Tomo
quelle
2
Bibliotheken brauchen definitiv nicht + x, um richtig zu laufen. Vielleicht sind sie aber Links? Links müssten + x folgen.
Chris S
Ja, sie brauchen kein + x, aber die meisten Bibliotheken haben es eingestellt.
Tomo
Diese Frage wurde auch unter Unix & Linux gestellt: unix.stackexchange.com/questions/40587/… (und dort die richtige Antwort erhalten)
Michał Górny

Antworten:

3

Eigentlich kommt es auf die lddUmsetzung an. lddIst normalerweise ein Skript, können Sie es bearbeiten, um zu sehen, wo und warum Sie diesen Fehler erhalten.

lddÜberprüft unter Ubuntu 10.04 readnur die Berechtigung. Es kann sein, dass der Fehler keine dynamische ausführbare Datei ist, wenn die Datei kein ELF ( Executable and Linkable Format ) ist. Die Bibliotheken hier sind -rw-r--r--zum Beispiel alle

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

Es ist nicht schockierend, einen xZugriff für eine gemeinsam genutzte Bibliothek zu wünschen . Der executableModus ist eine Konvention, die dem Betriebssystem eine weitere Ebene der Zugriffsrechtskontrolle bietet. Der ausführbare Loader steuert diesen Zugriff, um sicherzustellen, dass der Benutzer ihn ausführen kann, aber auch um Fehler zu vermeiden (einige Skripte oder Programme sollten von einigen Personen nicht ausgeführt werden).

Dies könnte aus dem gleichen Grunde auf die gemeinsam genutzten Bibliotheken erweitert werden - aber gemeinsam genutzte Bibliotheken können nicht laufen von selbst, und ist weniger fehleranfällig verwendet wird zufällig ). Somit ist die Notwendigkeit weniger offensichtlich (der rZugang reicht aus).

Ring Ø
quelle
3

Sie können tatsächlich viele Bibliotheken ausführen. Sehen Sie beispielsweise, was passiert, wenn Sie /lib/libc.so.6auf einem aktuellen GNU / Linux-System an Ihrer Shell tippen .

jaq
quelle
0

Denken Sie an eine ausführbare Datei mit -x. Sie können es nicht ausführen. Betrachten Sie diese Bibliotheken als eine Sammlung allgemeiner Funktionen, die von einem anderen Programm aufgerufen werden (sagen wir myProgra). Wenn Sie die Bibliotheken / Funktion nicht ausführen können ... dann haben Sie nichts

Ein Beispiel

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

Wenn Sie nun Funktion1 und Funktion2 in eine andere Datei einfügen und diese einschließen, erhalten Sie eine Bibliothek. (Natürlich ist es etwas komplizierter. Dies ist nur ein Beispiel)

Wie Sie sehen, müssen Sie in jedem Fall den Code ausführen, der in der Bibliothek enthalten ist

Nikolaidis Fotis
quelle
Sie führen jedoch ausführbare Dateien aus, keine Bibliotheken.
Ignacio Vazquez-Abrams
Siehe die bearbeitete Version oben
Nikolaidis Fotis
0

Der Schlüssel ist das Dateiformat, das ausführbare und das verknüpfbare Format. Da das gleiche exakte Dateiformat verwendet wird, um sowohl eine ausführbare Datei als auch eine gemeinsam genutzte Bibliothek zu identifizieren, müssen beide über die entsprechenden ausführbaren Berechtigungen für den Betriebssystemlader verfügen. Dies ermöglicht, dass ein einzelner Loader und ausführbare Dateien als DSO verwendet werden, wenn sie eine Symboltabelle enthalten.

nzwulfin
quelle
Der Loader verwendet also Berechtigungsbits und nicht den Dateikopf, um zu ladende Objekte zu identifizieren.
Tomo
Der Loader verwendet den Dateikopf, um den Inhalt als DYN oder EXEC zu identifizieren und die entsprechenden Schritte auszuführen. Das Ausführungsbit ist für das Betriebssystem und nicht für den Loader. ELF ist ein ausführbares Format. Ohne das Ausführungsbit erlaubt das Betriebssystem dem Loader nicht, die Datei auszuführen, um die Header zu lesen. Weitere Informationen zu ELF finden Sie in Wikipedia unter en.wikipedia.org/wiki/Executable_and_Linkable_Format .
Nzwulfin