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 brise lorsque les gens essaient d'exécuter un binaire statique sur une distribution Linux différente de celle pour laquelle il a été construit.
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.
Les liens statiques sont de retour !
- Linus Torvalds est en faveur de la liaison statique et s'est dit préoccupé par la quantité de liaisons statiques dans les distributions Linux (voir aussi cette discussion).
- Beaucoup (la plupart ?) Allez les exécutables du langage de programmation sont liés statiquement.
- La portabilité et la rétrocompatibilité accrues est l'une des raisons pour lesquelles ils sont populaires.
- D'autres langages de programmation font des efforts similaires pour rendre la liaison statique vraiment facile, par exemple :
- Haskell (Je travaille sur cet effort)
- Zig (voir ici pour plus de détails)
- Distributions Linux configurables / des ensembles de packages comme NixOS / nixpkgs permettent de lier une grande partie de leurs packages de manière statique (par exemple, son
pkgsStatic
l'ensemble de packages peut fournir toutes sortes d'exécutables liés statiquement). - La liaison statique peut entraîner une meilleure élimination du code inutilisé au moment du lien, ce qui réduit la taille des exécutables.
- libcs comme musl rendez les liens statiques faciles et corrects.
- Quelques grandes industries du logiciel les dirigeants sont d'accord là-dessus. Par exemple, Google écrit une nouvelle libc ciblée sur les liens statiques ("support static non-PIE and static-PIE linking" , "nous n'avons pas l'intention d'investir à ce stade [dans] le support de chargement dynamique et de liaison" ).
En ce qui concerne ce fait, existe-t-il maintenant un moyen raisonnable de créer une version statique pleinement fonctionnelle sous Linux ou la liaison statique est-elle complètement morte sous Linux ?
Je ne sais pas où trouver les références historiques, mais oui, les liens statiques sont morts sur les systèmes GNU. (Je crois qu'il est mort lors de la transition de libc4/libc5 à libc6/glibc 2.x.)
La fonctionnalité a été jugée inutile compte tenu 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 était liée sur un système contenant une vulnérabilité lib, elle sera perpétuée dans l'exécutable lié statiquement.
-
Gonflement du code. 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 qu'il y a longtemps, j'ai vu quelque chose en rapport avec LKML.