La liaison statique Linux est morte?
en fait, - statique drapeau gcc sur Linux ne fonctionne pas maintenant. Permettez-moi de citer de la GNU libc FAQ:
2.22. Même les programmes liés statiquement ont besoin de bibliothèques partagées ce qui n'est pas acceptable pour moi. Quel puis-je faire?
{AJ} NSS (pour plus de détails tapez simplement `info libc "Name Service Switch"') ne sont pas fonctionne correctement sans partage bibliothèque. NSS permet d'utiliser différents services (par ex. NIS, files, db, hesiod)) en changeant une seule configuration le fichier/etc/nsswitch.conf) sans re-lier tous les programmes. La seule l'inconvénient est que maintenant statique les bibliothèques doivent avoir accès à des documents partagés bibliothèque. C'est géré de manière transparente par la bibliothèque GNU C.
une solution est de configurer glibc avec -- enable-static-nss. Dans ce cas, vous pouvez créer un binaire statique qui n'utilisez que les services dns et fichiers (changement / etc / nsswitch.conf pour cela). Vous devez vous connecter 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 tu dois relier chaque statique programme qui utilise des routines NSS avec toutes ces bibliothèques.
{UD} en fait, on ne peut plus dire qu'une libc compilée 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, y a-t-il un moyen raisonnable de créer une construction statique fonctionnant entièrement sur Linux ou la liaison statique est complètement morte sur Linux? Je veux dire construction statique qui:
- se comporte exactement de la même manière que construction dynamique (statique-nss) avec un comportement incohérent est maléfique!);
- Travaux sur les variations de la glibc de l'environnement et de versions de Linux;
5 réponses
concernant ce fait, y a-t-il un moyen raisonnable de créer une construction statique fonctionnant entièrement sur Linux ou la liaison statique est complètement morte sur Linux?
Je ne sais pas où trouver les références historiques, mais oui, lien statique est mort sur les systèmes GNU. (Je crois qu'il est mort pendant la transition de libc4/libc5 à libc6/glibc 2.x.)
la fonctionnalité a été jugée inutile à la lumière de:
-
des failles de Sécurité. Application qui était liée statiquement ne supporte même pas la mise à niveau de libc. Si app était lié sur un système contenant une vulnérabilité lib, alors il va être perpétué dans l'exécutable lié statiquement.
-
Code de la météorisation. 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, puisque chaque application contient à l'intérieur de sa propre copie de tout. (Essayez
du -sh /usr/lib
pour comprendre l'étendue du problème.)
essayez de consulter les archives des listes de diffusion LKML et glibc d'il y a 10 à 15 ans. Il y a longtemps, J'ai vu quelque chose de lié sur LKML.
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 l'approche glibc est qu'elle Code difficilement les chemins vers les bibliothèques système (gconv aussi bien que nss), et donc elle casse quand les gens essaient d'exécuter un binaire statique sur une distribution Linux différente de celle pour laquelle il a été construit.
de toute façon, vous pouvez contourner la question gconv en positionnant GCONV_PATH au point à l'endroit approprié, cela m'a permis de prendre des binaires construits sur Ubuntu et les exécuter sur Red Hat.
les liens statiques ne semblent pas avoir beaucoup d'amour dans le monde Linux. Voici mon point de vue.
les personnes qui ne voient pas l'attrait des liens statiques 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 à tenter de relier entre elles une centaine de bibliothèques en constante évolution, tâche qu'ils accomplissent tous les jours. Jetez un oeil aux autotools si vous voulez savoir les backflips ils sont à l'aise d'effectuer.
mais on ne devrait pas s'attendre à ce que tous les autres passent la plupart de leur temps sur ce sujet. Les liens statiques vous prendront un long chemin vers être tamponné de bibliothèque churn. Le développeur peut mettre à jour les dépendances de son logiciel selon le calendrier du logiciel, plutôt que d'être forcé de le faire au moment où de nouvelles versions de bibliothèque apparaissent. Cela est important pour les applications faisant face à l'utilisateur avec des interfaces utilisateur complexes qui ont besoin de contrôler le flux de de nombreuses bibliothèques de niveau inférieur dont elles dépendent inévitablement. Et c'est pourquoi je serai toujours un fan de la liaison statique. Si vous pouvez établir un lien statique entre le code C et le code C++ portables compilés, vous avez fait du monde votre huître, car vous pouvez fournir plus rapidement des logiciels complexes à un large éventail d'appareils de plus en plus nombreux.
il y a beaucoup de points de désaccord là-bas, d'autres perspectives, et c'est bien que le logiciel libre les permette tous.
ce n'est pas parce que vous devez vous connecter dynamiquement au service NSS que vous ne pouvez pas vous connecter statiquement à une autre bibliothèque. Tout ce que la FAQ dit est que même les programmes "statically" liés ont certains bibliothèques dynamiquement liées. Il ne dit pas que la liaison statique est "impossible" ou qu'il "ne fonctionne pas".
ajouter à d'autres réponses:
en raison des raisons indiquées dans les autres réponses, ce n'est pas recommandé pour la plupart des distributions Linux, mais il y a en fait des distributions qui sont faites spécifiquement pour exécuter des binaires liés statiquement:
de stali description:
linux statique est basé sur une sélection manuelle des meilleurs outils pour chaque tâche et chaque outil lié statiquement (y compris certains X clients tels que st, surf, dwm, dmenu),
il vise également la réduction de taille binaire par l'évitement de glibc et d'autres bibliothèques GNU gonflées lorsque cela est possible (les premières expériences montrent que statiquement binaires sont généralement plus petits que leurs des homologues glibc dynamiquement liés!!!). Remarque, c'est à peu près contrairement à ce qu'Ulrich Drepper pense des liaisons statiques.
en raison de l'avantage secondaire que les binaires statiquement liés commencent plus rapidement, la distribution cible également les gains de rendement.
la liaison Statique contribue aussi à la réduction de la dépendance.
vous pouvez lire la suite à propos de cela dans cette question sur la liaison statique vs dynamique .