76 votes

La liaison statique de Linux est morte?

En fait, -statique de la gcc drapeau sur Linux ne fonctionne pas aujourd'hui. Permettez-moi de citer de la GNU libc FAQ:

2.22. Même lié statiquement les programmes ont besoin de certaines bibliothèques partagées ce qui n'est pas acceptable pour moi. Ce puis-je faire?

{AJ} NSS (pour plus de détails tapez simplement `info libc "Name Service Switch"') ne sont pas travail correctement sans partagée des bibliothèques. NSS permet l'utilisation de différents services (par exemple, NIS, fichiers, db, hésiode) en changeant juste une configuration le fichier/etc/nsswitch.conf) sans re-lier tous les programmes. La seule l'inconvénient est que maintenant statique les bibliothèques ont besoin de l'accès partagé des bibliothèques. C'est géré de manière transparente par la bibliothèque C de GNU.

Une solution est de configurer la glibc avec --enable-static-nss. Dans ce cas, vous pouvez créer un binaire statique qui utiliser uniquement les services dns et les fichiers (changer /etc/nsswitch.conf pour cela). Vous avez besoin de relier explicitement contre l'ensemble de 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 avez obtenu pour chaque lien statique programme qui utilise NSS routines avec toutes ces bibliothèques.
{UD} En fait, on ne peut pas en dire plus, qu'une libc compilé avec cette option est l'aide de NSS. Il n'y a pas d'interrupteur plus. Par conséquent, il est très recommandé de ne pas utiliser --enable-static-nss car cela rend le comportement des programmes sur l' système incohérent.

Concernant ce fait est-il raisonnable de façon à créer un plein fonctionnement de l'accumulation d'électricité statique sur Linux ou sur la liaison statique est complètement morte sur Linux? Je veux dire l'accumulation d'électricité statique qui:

  • Se comporte exactement de la même manière que dynamique de construire n' (statique-nss avec comportement incohérent est le mal!);
  • Travaux sur les variations de la glibc de l'environnement et de versions de Linux;

46voto

Ketil Points 181

Je pense que c'est très ennuyeux, et je pense qu'il est arrogant pour appeler une fonction "inutile" parce qu'il a des problèmes avec certains cas d'utilisation. Le plus gros problème avec la glibc approche est qu'il est difficile de codes chemins de bibliothèques (gconv ainsi que nss), et donc il se casse quand les gens essaient d'exécuter un binaire statique sur une distribution Linux différent de celui qu'il a été construit pour les.

De toute façon, vous pouvez travailler autour de la gconv problème en définissant GCONV_PATH pour pointer vers l'emplacement approprié, cela m'a permis de prendre binaires construit sur Ubuntu et de les exécuter sur Red Hat.

36voto

Dummy00001 Points 6088

Concernant ce fait est-il raisonnable de façon à créer un plein fonctionnement de l'accumulation d'électricité statique sur Linux ou sur la liaison statique est complètement morte sur Linux?

Je ne sais pas où trouver les références historiques, mais oui, la liaison statique est morts sur des systèmes GNU. (Je crois qu'il est mort lors de la transition de libc4/libc5 de libc6/glibc 2.x.)

La fonctionnalité a été jugé inutile à la lumière de:

  • Les failles de sécurité. L'Application qui a été lié statiquement ne prend même pas en charge les mises à niveau de la libc. Si l'application a été lié sur le système contenant une lib de vulnérabilité, alors il va se perpétuer au sein de l'exécutable lié statiquement.

  • Code de la météorisation. Si de nombreuses applications liées statiquement sont a couru sur le même système, les bibliothèques standard ne serait pas être réutilisés, car chaque application contient à l'intérieur de sa propre copie de tout. (Essayez du -sh /usr/lib , de comprendre l'étendue du problème.)

Essayez de creuser la LKML et glibc mail les archives de la liste de 10-15 ans. Je suis assez sûr il y a longtemps j'ai vu quelque chose sur la LKML.

13voto

Dean Harding Points 40164

Ce n'est pas parce que vous devez établir un lien dynamique avec le service NSS que vous ne pouvez pas vous connecter de manière statique à une autre bibliothèque. Tout ce que dit la FAQ, c'est que même les programmes liés "statiquement" ont des bibliothèques liées dynamiquement. Cela ne veut pas dire que les liens statiques sont "impossibles" ou que cela "ne fonctionne pas".

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