web-dev-qa-db-fra.com

Utilisez des bibliothèques statiques et dynamiquement liées à GCC

J'ai besoin de distribuer un binaire qui fonctionnera autant de distributions X86 Linux que possible. Cela signifie que je dois lier statiquement certaines bibliothèques, comme GLIBC, car l'utilisateur pourrait ne pas avoir la version que j'utilise. D'autres bibliothèques doivent être liées de manière dynamique, comme FontConfig, car elle s'appuie sur un format de fichier de cache et des emplacements codés durs pouvant 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 de manière dynamique toutes les bibliothèques.

44
Steve Hanov

La liaison statique de toute bibliothèque système, et particulièrement contre libc, sur les systèmes modernes Unix ou Linux rend le binaire de manière significative moins portable. Juste ne le fais pas.

Au lieu de cela, utilisez la compatibilité en arrière (les binaires liés à un système ancien continuent de courir sur tous les plus récents) à votre avantage, soit en reliant votre binaire sur un ancien système (j'utilise Redhat 6.2, et je n'ai pas vu de système Linux où mon 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

causer une liaison à utiliser la version d'archive de Libfoo. [Il est important d'avoir la fuite -Wl,-Bdynamic précisément que vous ne forcez pas Static Libc.]

79

Il convient de noter que, sous Linux, vous pouvez uniquement (en toute sécurité) lier de manière statique une bibliothèque si aucune des bibliothèques dynamiques ne dépend de celle-ci. Cela signifie que si vous utilisez des bibliothèques dynamiques, vous pouvez oublier statiquement la liaison de libc. Il suffit d'utiliser une version assez ancienne à construire contre le cas de Libc; Libc a maintenu une forte compatibilité ABI à l'arrière au fil des ans.

5
bdonlan