53 votes

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

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

Quelles sont les options de la ligne de commande pour faire cela ? Si je spécifie -static, alors gcc refusera de lier dynamiquement toute bibliothèque.

95voto

Employed Russian Points 50479

L'établissement de liens statiques avec n'importe quelle bibliothèque système, et en particulier avec libc sur les systèmes modernes UNIX ou Linux, rend le binaire considérablement moins portable. Ne le faites pas.

Au lieu de cela, utilisez la rétrocompatibilité (les binaires liés à un ancien système continuent de fonctionner sur tous les systèmes plus récents) à 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 sur lequel mon binaire ne fonctionnera pas au cours des 8 dernières années), soit en utilisant quelque chose comme autopackage (qui a été supprimé après la rédaction de cette réponse).

Pour répondre à votre question initiale :

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

fera en sorte que l'éditeur de liens utilise la version archive de libfoo. [Il est important d'avoir la terminaison -Wl,-Bdynamic précisément pour ne pas forcer la libc statique].

12 votes

C'est la première fois que je vois une explication pour cette dynamique de queue, merci.

3 votes

Vos conseils ont résisté à l'épreuve du temps. Maintenant, je construis toujours sur le plus ancien Linux que je veux supporter.

7voto

bdonlan Points 90068

Il faut noter que, sous Linux, vous ne pouvez lier statiquement (sans risque) 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 libc. Utilisez simplement une version assez ancienne pour construire avec libc ; libc a maintenu une forte compatibilité ascendante avec l'ABI au cours des années.

4voto

Mihai Limbășan Points 17205

Essayez de passer les chemins des fichiers de bibliothèque que vous liez sur la ligne de commande de l'éditeur de liens (qu'il s'agisse de bibliothèques .a ou .so) et laissez tomber -static. Cela devrait faire l'affaire.

2 votes

Lorsqu'il n'y a pas -static il y a aussi -l: de ld, qui peut être utilisée pour lier une bibliothèque par son nom complet, sans que ld ne l'étende à l'option lib + name + .so : -l:libsome_library.a ( sourceware.org/binutils/docs-2.18/ld/Options.html - -lnamespec "Si namespec est de la forme :filename, ld cherchera dans le chemin de la bibliothèque un fichier appelé filename, sinon il cherchera dans le chemin de la bibliothèque un fichier appelé libnamespec.a.")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X