web-dev-qa-db-fra.com

La liaison statique Linux est morte?

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:

  • Se comporte exactement de la même manière que la construction dynamique (statique-nss avec un comportement incohérent est mauvais!);
  • Fonctionne sur des variations raisonnables de l'environnement glibc et des versions Linux;
60
Shcheklein

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.

26
Dummy00001

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.

39
Ketil

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.

19
moodboom

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 ".

12
Dean Harding

La liaison statique est de retour!

  • De nombreux (la plupart?) Go exécutables du langage de programmation sont liés statiquement.
    • La portabilité accrue et la compatibilité descendante sont une des raisons pour lesquelles elles sont populaires.
  • D'autres langages de programmation ont des efforts similaires pour rendre la liaison statique vraiment facile, par exemple Haskell (je travaille sur cela effort ).
  • Les distributions Linux configurables /ensembles de packages comme NixOS / nixpkgs permettent de lier une grande fraction de leurs packages statiquement (par exemple, son ensemble de packages pkgsStatic peut fournir toutes sortes d'exécutables liés statiquement).
  • La liaison statique peut entraîner une meilleure élimination du code inutilisé au moment de la liaison, ce qui rend les exécutables plus petits.
  • des libcs ​​comme ( musl rendent la liaison statique facile et correcte.
  • Certains grands leaders de l'industrie du logiciel sont d'accord là-dessus. Par exemple Google écrit une nouvelle libc destinée aux liaisons statiques ( "supporte les liaisons statiques non-PIE et statiques-PIE", "nous n'avons pas l'intention à investir à ce stade [dans] le support de chargement et de liaison dynamique ").
10
nh2

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 .

9
Farid Nouri Neshat