Quelle est la différence entre un fichier .a et un fichier .so?

Réponses:

54

Un .afichier est une bibliothèque statique, tandis qu'un .sofichier est une bibliothèque à objets partagés (dynamique) similaire à une DLL sous Windows. Vous trouverez des informations détaillées sur les différences entre les deux sur cette page .

ajk
la source
18
.ane peut être inclus que dans le cadre d’un programme lors de la compilation. .sopeut être "importé" lors du chargement d'un programme.
LawrenceC
2
Que veut dire .a?
hfrmobile
2
@hfrmobile a signifie archive - une bibliothèque statique est une collection de fichiers objets créés à l'aide de l' arutilitaire. Plus d'infos ici
mercredi
28

Ensuite, un fichier .a est une archive "ar". Tout comme une archive tar, il stocke des fichiers .o ou objets, leur permettant ainsi d'être extraits de l'archive et liés à un programme, entre autres. Vous pouvez utiliser ar pour stocker d'autres fichiers si vous le souhaitez.

Vous pouvez obtenir une liste des membres d'un fichier ar avec le paramètre -t, par exemple:

ar -t /usr/lib/libc.a

Un fichier .so est un fichier "objet partagé" et contient beaucoup plus d'informations disponibles pour l'éditeur de liens, de sorte que les membres puissent être liés à un programme de chargement aussi rapidement que possible.

Par exemple, essayez:

objdump -T /lib/libc-2.11.1.so

(ou quelle que soit la version de libc.so que vous avez dans votre répertoire / lib.) Notez qu'un fichier .so peut également contenir un script d'éditeur de liens lui demandant de rechercher le fichier ailleurs ou d'utiliser autre chose.

Fait intéressant, un fichier .so peut également être un programme à part entière. Par exemple, essayez d’exécuter /lib/libc.so.6 . (Malheureusement, cette dernière partie ne semble pas fonctionner sur des systèmes plus modernes. Ce n'est pas une grande perte.)

Scie à métaux
la source
Faute de frappe. tu veux dire écrire ar -t /usr/lib/libc.a. En fait, -cela ne semble pas être nécessaire dans ce cas. Également /lib/libc.so.6.juste imprime une sortie. Je ne sais pas si je l'appellerais un full fledged program.
Faheem Mitha
1
C'est un programme à part entière dans le sens où il a un symbole principal que l'exécutif doit trouver.
Hack Saw
2
Vous pouvez également exécuter lddsur .so, et il vous montrera quelles autres bibliothèques il utilise. Static reviendra avec un message disant que ce n'est pas une bibliothèque dynamique.
Marcin