Linux liaison statique est mort?
En fait, -statique 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é 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;
- N'a pas d'autre remplacement de la bibliothèque C convenir à votre but? (alimentation / uclibc / etc) ?
- Utilisent-ils NSS? Le plus probable, le comportement vais être incompatibles, car je doute que ces bibliothèques prendre en compte NSS.
- Ne vous utilisez toutes les fonctions qui finalement se termine par l'appel à nss (par exemple gethostname/getpwname/getgroups/etc.) ?
- Assurez -)) C'est une application client/serveur.
- Est-ce toujours le cas ou les choses ont changé depuis 2010?
- découvrez static linux
Vous devez vous connecter pour publier un commentaire.
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:
Des 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
pour comprendre l'étendue du problème.)Essayer 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.
eglibc
fourche deglibc
a fait de la liaison statique au moins à mi-chemin-de nouveau possible, mais si vous voulez à réellement utiliser la liaison statique sans gigantesque binaires et les bugs/problèmes comme nss, vous avez probablement besoin d'utiliser un autre libc mise en œuvre.execve
la première ligne demain
après l'auto-exec. Pour un banal programme avec pas de bibliothèques partagées à l'exception de la libc, la liaison statique prend environ 50% de temps en moins à l'auto-exec, et le temps est de l'ordre de quelques dizaines ou centaines de microsecondes en fonction de la vitesse de la machine. Jeter quelques shared libs et vous pouvez facilement le faire à 90% de moins. Vous êtes en comparant O(n) en temps O(1) temps donc, peu importe comment petit la par-lib coût que vous pouvez atteindre arbitrairement proche de 100%, mais dans la pratique, il ne prend que quelques.mmap
surcharge est assez importante avec beaucoup de bibliothèques. Pour les petites bibliothèquesmmap
temps va dominer de toute façon, mais pour les grands (de l'esp. C++) des bibliothèques, à la relocalisation de temps, y compris la demande de pagination dans tous les data/EU de la page qui doit être patché, est le facteur dominant.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.
Liaison statique ne semble pas obtenir beaucoup d'amour dans le monde de Linux. Voici mon point de vue.
Gens qui ne voient pas l'appel de la liaison statique généralement travailler dans le domaine de l'amande et de bas niveau du système d'exploitation. Beaucoup de *nix bibliothèque développeurs ont passé leur vie à traiter avec les inévitables problèmes d'essayer de lier d'une centaine de constante évolution des bibliothèques ensemble, une tâche qu'ils font chaque jour. Jetez un oeil à autotools si jamais vous voulez savoir les backflips ils sont à l'aise d'effectuer.
Mais tout le monde ne doit pas être prévu de passer la plupart de leur temps sur cette. La liaison statique vous prendra un long chemin vers le tampon de la bibliothèque du taux de désabonnement. Le développeur peut mettre à niveau son logiciel de dépendances en fonction du logiciel de planification, plutôt que d'être forcé de le faire dès que de nouvelles versions de la bibliothèque apparaît. Ceci est important pour les utilisateurs d'applications avec des interfaces utilisateur complexes qui ont besoin de contrôler le flux de la de nombreux de niveau inférieur bibliothèques dont ils dépendent inévitablement. Et c'est pourquoi je serai toujours un fan de la liaison statique. Si vous pouvez lier statiquement cross-compilé portable code C et C++, vous avez assez bien fait, le monde est votre huître, comme vous pouvez vous en offrir plus rapidement des logiciels complexes à un large éventail de la mondiale sans cesse croissante des appareils.
Il ya beaucoup à être en désaccord avec il y, à partir d'autres points de vue, et c'est agréable que les logiciels open source qui permet de les tous.
Juste parce que vous avez un lien dynamique vers le NSS service ne signifie pas que vous ne peut pas lier statiquement à n'importe quelle autre bibliothèque. Tout ce que la FAQ est en train de dire, c'est que même "statiquement" lié programmes ont certains bibliothèques liées de manière dynamique. Il ne dit pas que la liaison statique est "impossible" ou qu'il "ne fonctionne pas".
Liaison statique est de retour sur la montée!
pkgsStatic
ensemble de paquets pouvons fournir toutes sortes de statiquement les exécutables).libc
mises à jour. Mais je peux toujours fournir un nouveau binaire pour mon (entièrement) lié statiquement programme pour les appareils sur le terrain à tout moment.D'y ajouter d'autres réponses:
Pour les raisons dit dans les autres réponses, il n'est pas recommandé pour la plupart des distributions Linux, mais il ya effectivement des distributions qui sont faites spécifiquement pour exécuter lié statiquement binaires:
De stali description:
La liaison statique contribue aussi à la réduction de la dépendance.
Vous pouvez en lire plus à ce sujet dans cette question de la statique vs dynamique reliant.