Pourquoi convertir SO en A ?
Les développeurs remplacent un .so partagé par un .a statique pour produire un binaire autonome qui ne dépend pas de la présence du .so au moment de l'exécution - ce qui est utile lors du déploiement sur des machines où la bibliothèque n'est peut-être pas installée. Un .a est une archive au format ar de fichiers objets compilés, tandis qu'un .so est un objet partagé ELF entièrement lié ; les deux sont construits à partir de la même source à des étapes différentes.
Comment convertir SO en A
ar (binutils) OPEN-SOURCE
Compilez les fichiers sources en fichiers objets (gcc -c -o foo.o foo.c), puis exécutez ar rcs libfoo.a *.o pour les regrouper dans une archive statique .a.
GCC / Clang OPEN-SOURCE
Exécutez ./configure --enable-static && make dans le répertoire source de la bibliothèque pour construire le .a à côté ou à la place du .so.
apt / dnf / pacman FREE
Installez le paquet -dev ou -static de la bibliothèque (par exemple, apt install libfoo-dev) pour obtenir le .a précompilé sans compiler à partir des sources ; les archives statiques sont généralement placées dans /usr/lib/.
À propos de ces formats
Un fichier .so est une bibliothèque d'objets partagés sur Linux et Unix - l'équivalent Linux d'un .dll Windows. Les programmes le chargent automatiquement lors de l'exécution ; vous ne…
Ouvrir les détails de .SO →Un fichier .a est une bibliothèque statique utilisée sur Unix, Linux et macOS. Il s'agit d'une archive au format ar contenant des fichiers objets compilés que l'éditeur de liens copie dans…
Ouvrir les détails de .A →Qualité et points de vigilance
- Un
.soutilise du code indépendant de la position (compilé avec-fPIC) ; mélanger des fichiers objets PIC dans un.alié à un exécutable non-PIE peut parfois provoquer des avertissements de l'éditeur de liens, mais cela fonctionne généralement. - Les numéros de version dans les noms de fichiers
.so(par exemple,libssl.so.3.0.2) n'ont pas d'équivalent dans le.a- les bibliothèques statiques ne portent pas de SONAME. - Si seul le
.sofinal est disponible sans source ni paquet, il n'existe pas de convertisseur binaire - vous devez obtenir ou compiler la bibliothèque statique à partir des sources.
Foire aux questions
Puis-je extraire des fichiers objets d'un `.so` comme je peux le faire d'un `.a` ?
.so ; ar x fonctionne sur les archives .a, pas sur les fichiers .so.Pourquoi utiliser un `.a` au lieu d'un `.so` ?
.so n'est pas installé, ce qui simplifie le déploiement dans des environnements minimaux ou isolés.Où se retrouve le `.a` statique après l'installation d'un paquet `-dev` ?
/usr/lib/x86_64-linux-gnu/libfoo.a sur Debian/Ubuntu, ou le chemin de bibliothèque équivalent sur d'autres distributions.