Pourquoi les bibliothèques partagées sur Linux sont-elles exécutables?

8

Je suis juste curieux.

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

Tout semble bien fonctionner juste avec + r. J'ai remarqué que la plupart des fichiers .so dans / usr / lib ont + x défini ...

Pourquoi les bibliothèques partagées sont-elles censées avoir un bit exécutable défini? Que pourrait-il arriver si je ne le réglais pas?

Tomo
la source
2
Les bibliothèques n'ont certainement pas besoin de + x pour fonctionner correctement. Ce sont peut-être des liens cependant? Les liens auraient besoin de + x pour être suivis.
Chris S
Oui, ils n'ont pas besoin de + x, mais la plupart des bibliothèques l'ont défini.
Tomo
Cette question a également été posée sur Unix et Linux: unix.stackexchange.com/questions/40587/… (et a obtenu la bonne réponse là-bas)
Michał Górny

Réponses:

3

En fait, cela dépend de la lddmise en œuvre. lddest généralement un script, vous pouvez le modifier pour voir où et pourquoi vous obtenez cette erreur.

Sur Ubuntu 10.04, lddvérifie readuniquement l' autorisation. Il peut donner l'erreur non un exécutable dynamique si le fichier n'est pas un ELF ( Executable and Linkable Format ). Les bibliothèques ici sont toutes -rw-r--r--, par exemple

$ 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

Il n'est pas choquant de vouloir un xaccès à une bibliothèque partagée. Le executablemode est une convention qui donne au système d'exploitation un autre niveau de contrôle des droits d'accès. Le chargeur exécutable contrôle cet accès, pour garantir que l'utilisateur peut l'exécuter, mais aussi pour éviter les erreurs (certains scripts ou programmes ne doivent pas être exécutés par certaines personnes).

Cela pourrait être étendu aux bibliothèques partagées pour la même raison - mais les bibliothèques partagées ne peuvent pas fonctionner seules et sont moins sujettes aux erreurs d'être utilisées par accident ). Ainsi, le besoin est moins évident (l' raccès suffit).

e2-e4
la source
3

Vous pouvez réellement exécuter de nombreuses bibliothèques, voyez par exemple ce qui se passe lorsque vous tapez /lib/libc.so.6sur votre shell sur un système GNU / Linux récent.

jaq
la source
0

pensez comme avoir un fichier exécutable avec -x. Vous ne pourrez pas l'exécuter. Considérez ces bibliothèques comme une collection de fonctions générales appelées par un autre programme (disons myProgra). Si vous ne pouvez pas exécuter les bibliothèques / fonction ... alors vous n'avez rien

Un exemple

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

Maintenant, si vous placez function1 et function2 dans un autre fichier et que vous l'incluez, alors vous une bibliothèque. (Bien sûr, c'est quelque chose de plus compliqué. Ce n'est qu'un exemple)

Mais dans tous les cas, comme vous pouvez le voir, vous devez exécuter le code qui est inclus dans la bibliothèque

Nikolaidis Fotis
la source
Mais vous exécutez des exécutables, pas des bibliothèques.
Ignacio Vazquez-Abrams
Voir la version éditée ci
Nikolaidis Fotis
0

La clé est le format de fichier, le format exécutable et linkable. Étant donné que le même format de fichier exact est utilisé pour identifier à la fois un exécutable et une bibliothèque partagée, les deux doivent disposer des autorisations d'exécutables appropriées pour le chargeur de système d'exploitation. Cela permet à un chargeur unique et aux exécutables d'être utilisés comme DSO s'ils incluent une table de symboles.

nzwulfin
la source
Ainsi, le chargeur utilise des bits d'autorisation, pas l'en-tête du fichier, pour identifier les éléments à charger?
Tomo
Le chargeur utilise l'en-tête du fichier pour identifier le contenu comme DYN ou EXEC et faire la chose appropriée. Le bit d'exécution est destiné au système d'exploitation, pas au chargeur. ELF est un format exécutable, sans le bit d'exécution, le système d'exploitation ne permettra pas au chargeur d'exécuter le fichier afin de lire les en-têtes. Consultez wikipedia pour en savoir plus sur ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
nzwulfin