En fait, - l'indicateur gcc statique sous Linux ne fonctionne pas maintenant. Permettez-moi de citer la FAQ GNU libc:
2.22. Même les programmes liés statiquement ont besoin de bibliothèques partagées, ce qui n'est pas acceptable pour moi. Que puis-je faire?
{AJ} NSS (pour plus de détails, tapez `info libc" Name Service Switch "') ne fonctionnera pas correctement sans bibliothèques partagées. NSS permet d'utiliser différents services (par exemple NIS, fichiers, db, hesiod) en changeant simplement un fichier de configuration (/etc/nsswitch.conf) sans relier aucun programme. Le seul inconvénient est que les bibliothèques statiques doivent désormais accéder aux bibliothèques partagées. Ceci est géré de manière transparente par la bibliothèque GNU C.
Une solution consiste à configurer la glibc avec --enable-static-nss. Dans ce cas, vous pouvez créer un binaire statique qui n'utilisera que les services DNS et les fichiers (changez /etc/nsswitch.conf pour cela). Vous devez établir un lien explicite avec tous ces services. Par exemple:
gcc -static test-netdb.c -o test-netdb \ -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group
Le problème avec cette approche est que vous devez lier tous les programmes statiques qui utilisent des routines NSS avec toutes ces bibliothèques.
{UD} En fait, on ne peut plus dire qu'une libc compilée avec cette option utilise NSS. Il n'y a plus de commutateur. Par conséquent, il est hautement recommandé pas d'utiliser --enable-static-nss car cela rend le comportement des programmes sur le système incohérent.
Concernant ce fait, existe-t-il un moyen raisonnable de créer une compilation statique pleinement fonctionnelle sous Linux ou une liaison statique est complètement morte sous Linux? Je veux dire une construction statique qui:
Concernant ce fait, existe-t-il un moyen raisonnable de créer une compilation statique pleinement fonctionnelle sous Linux ou une liaison statique est complètement morte sous Linux?
Je ne sais pas où trouver les références historiques, mais oui, liaison statique est mort sur les systèmes GNU. (Je crois qu'il est mort pendant la transition de libc4/libc5 vers libc6/glibc 2.x.)
La fonctionnalité a été jugée inutile à la lumière de:
Vulnérabilités de sécurité. L'application qui était liée statiquement ne prend même pas en charge la mise à niveau de libc. Si l'application a été liée sur un système contenant une vulnérabilité lib, elle va se perpétuer au sein de l'exécutable lié statiquement.
Code ballonnement. Si de nombreuses applications liées statiquement sont exécutées sur le même système, les bibliothèques standard ne seront pas réutilisées, car chaque application contient sa propre copie de tout. (Essayez du -sh /usr/lib
pour comprendre l'étendue du problème.)
Essayez de creuser des archives de listes de diffusion LKML et glibc d'il y a 10 à 15 ans. Je suis à peu près sûr il y a longtemps que j'ai vu quelque chose de lié sur LKML.
Je pense que c'est très ennuyeux, et je pense qu'il est arrogant d'appeler une fonctionnalité "inutile" car elle a des problèmes avec certains cas d'utilisation. Le plus gros problème avec l'approche glibc est qu'elle code en dur les chemins vers les bibliothèques système (gconv ainsi que nss), et donc elle se casse lorsque les gens essaient d'exécuter un binaire statique sur une distribution Linux différente de celle pour laquelle elle a été conçue.
Quoi qu'il en soit, vous pouvez contourner le problème gconv en définissant GCONV_PATH pour pointer vers l'emplacement approprié, cela m'a permis de prendre des binaires construits sur Ubuntu et de les exécuter sur Red Hat.
La liaison statique ne semble pas susciter beaucoup d'amour dans le monde Linux. Voici mon point de vue.
Les personnes qui ne voient pas l'intérêt de la liaison statique travaillent généralement dans le domaine du noyau et du système d'exploitation de niveau inférieur. De nombreux développeurs de bibliothèques * nix ont passé leur vie à résoudre les problèmes inévitables d'essayer de relier une centaine de bibliothèques en constante évolution, une tâche qu'ils font tous les jours. Jetez un coup d'œil aux outils automatiques si vous souhaitez connaître les backflips qu'ils sont à l'aise d'effectuer.
Mais il ne faut pas s'attendre à ce que tout le monde passe le plus clair de son temps là-dessus. La liaison statique vous amènera un long chemin vers la mise en mémoire tampon de la désabonnement de bibliothèque. Le développeur peut mettre à niveau les dépendances de son logiciel selon le calendrier du logiciel, plutôt que d'être obligé de le faire au moment où de nouvelles versions de bibliothèque apparaissent. Ceci est important pour les applications destinées aux utilisateurs avec des interfaces utilisateur complexes qui doivent contrôler le flux des nombreuses bibliothèques de niveau inférieur dont elles dépendent inévitablement. Et c'est pourquoi je serai toujours un fan des liens statiques. Si vous pouvez lier statiquement du code C et C++ portable compilé de manière croisée, vous avez à peu près fait du monde votre huître, car vous pouvez fournir plus rapidement des logiciels complexes à une large gamme d'appareils sans cesse croissants dans le monde.
Il y a beaucoup de points de désaccord avec cela, sous d'autres perspectives, et c'est bien que les logiciels open source leur permettent tous.
Ce n'est pas parce que vous devez vous lier dynamiquement au service NSS que vous ne pouvez pas lier statiquement à une autre bibliothèque. Tout ce que FAQ dit, c'est que même les programmes liés "statiquement" ont certains bibliothèques liées dynamiquement. Cela ne veut pas dire que la liaison statique est "impossible" ou qu'elle " ne fonctionne pas ".
La liaison statique est de retour!
pkgsStatic
peut fournir toutes sortes d'exécutables liés statiquement).Ajout d'autres réponses:
Pour les raisons mentionnées dans les autres réponses, ce n'est pas recommandé pour la plupart des distributions Linux, mais il existe en fait des distributions qui sont faites spécifiquement pour exécuter des binaires liés statiquement:
De la description de stali:
statique linux est basé sur une collection sélectionnée à la main des meilleurs outils pour chaque tâche et chaque outil étant lié statiquement (y compris certains clients X tels que st, surf, dwm, dmenu),
Il cible également la réduction de la taille binaire en évitant la glibc et d'autres bibliothèques gonflées GNU lorsque cela est possible (les premières expériences montrent que les binaires liés statiquement sont généralement plus petits que leurs homologues glibc liés dynamiquement !!!). Remarque , c'est à peu près contraire à ce qu'Ulrich Drepper estime à propos de la liaison statique.
En raison de l'avantage secondaire que les binaires liés statiquement démarrent plus rapidement, la distribution cible également les gains de performances.
La liaison statique permet également de réduire la dépendance.
Vous pouvez en savoir plus à ce sujet dans cette question sur les liens statiques vs dynamiques .