Utiliser des bibliothèques liées statiquement et dynamiquement dans gcc

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

Question

Je dois distribuer un binaire qui fonctionnera sur autant de distributions Linux x86 que possible. Cela signifie que je dois relier statiquement certaines bibliothèques, comme glibc, car il est possible que l'utilisateur ne dispose pas de la version que j'utilise. Les autres bibliothèques doivent être liées dynamiquement, comme fontconfig, car elles reposent sur un format de fichier cache et des emplacements codés en dur pouvant être différents sur chaque système.

Quelles sont les options en ligne de commande pour ce faire? Si je spécifie -static, alors gcc refusera de lier dynamiquement les bibliothèques.

Était-ce utile?

La solution

La liaison statique avec n'importe quelle bibliothèque système, et en particulier avec libc , sur les systèmes UNIX ou Linux modernes, rend le fichier binaire considérablement less portable. Ne le fais pas.

Au lieu de cela, utilisez la compatibilité ascendante (les binaires liés sur un ancien système continuent de fonctionner sur tous les nouveaux) à votre avantage, soit en liant votre binaire sur un ancien système (j'utilise RedHat 6.2, et je n'ai pas vu de système Linux où mon fichier binaire ne fonctionnera pas au cours des 8 dernières années) ou en utilisant quelque chose comme autopackage (qui a été supprimé après l'écriture de cette réponse).

Pour répondre à votre question initiale:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

obligera l'éditeur de liens à utiliser la version archive de libfoo. [Il est important d’avoir le -Wl, -Bdynamic de fin pour éviter de forcer la bibliothèque statique.]

Autres conseils

Il convient de noter que, sous Linux, vous ne pouvez lier de manière statique (en toute sécurité) une bibliothèque que si aucune des bibliothèques dynamiques n’en dépend. Cela signifie que si vous utilisez des bibliothèques dynamiques, vous pouvez oublier de lier statiquement la libc. Utilisez juste une version assez ancienne pour construire contre le cas de libc; La libc a maintenu une forte compatibilité ascendante ABI au fil des ans.

Essayez de transmettre les chemins d'accès aux fichiers de bibliothèque sur lesquels vous créez un lien sur la ligne de commande de l'éditeur de liens (qu'il s'agisse de bibliothèques .a ou .so) et déposez-les en mode statique. Cela devrait faire l'affaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top