GNU/Linux >> Linux Esercitazione >  >> Linux

Il collegamento statico di Linux è morto?

Penso che questo sia molto fastidioso e penso che sia arrogante definire una funzionalità "inutile" perché ha problemi a gestire determinati casi d'uso. Il problema più grande con l'approccio glibc è che codifica i percorsi delle librerie di sistema (gconv così come nss), e quindi si interrompe quando le persone provano a eseguire un binario statico su una distribuzione Linux diversa da quella per cui è stato creato.

Ad ogni modo, puoi aggirare il problema di gconv impostando GCONV_PATH in modo che punti alla posizione appropriata, questo mi ha permesso di prendere i binari creati su Ubuntu ed eseguirli su Red Hat.


Il collegamento statico è tornato in ascesa!

  • Linus Torvalds è a supporto del collegamento statico e ha espresso preoccupazione per la quantità di collegamenti statici nelle distribuzioni Linux (vedi anche questa discussione).
  • Molti (la maggior parte?) Vai gli eseguibili del linguaggio di programmazione sono collegati staticamente.
    • La maggiore portabilità e retrocompatibilità è uno dei motivi per cui sono popolari.
  • Altri linguaggi di programmazione hanno sforzi simili per rendere il collegamento statico davvero semplice, ad esempio:
    • Haskell (Sto lavorando a questo sforzo)
    • Zig (vedi qui per i dettagli)
  • Distribuzioni Linux configurabili / insiemi di pacchetti come NixOS / nixpkgs consentono di collegare staticamente un'ampia frazione dei loro pacchetti (ad esempio, il suo pkgsStatic set di pacchetti può fornire tutti i tipi di eseguibili collegati staticamente).
  • Il collegamento statico può comportare una migliore eliminazione del codice inutilizzato al momento del collegamento, riducendo gli eseguibili.
  • libc come musl rendere il collegamento statico facile e corretto.
  • Un grande settore di software i leader sono d'accordo su questo. Ad esempio, Google sta scrivendo una nuova libc mirata al collegamento statico ("support static non-PIE linking and static-PIE linking" , "non intendiamo investire a questo punto [nel] caricamento dinamico e nel supporto dei collegamenti" ).

Riguardo a questo fatto, esiste un modo ragionevole ora per creare una build statica completamente funzionante su Linux o il collegamento statico è completamente morto su Linux?

Non so dove trovare i riferimenti storici, ma sì, il collegamento statico è morto sui sistemi GNU. (Credo che sia morto durante la transizione da libc4/libc5 a libc6/glibc 2.x.)

La funzionalità è stata ritenuta inutile alla luce di:

  • Vulnerabilità di sicurezza. L'applicazione collegata staticamente non supporta nemmeno l'aggiornamento di libc. Se l'app è stata collegata a un sistema contenente una vulnerabilità lib, verrà perpetuata all'interno dell'eseguibile collegato staticamente.

  • Codice gonfio. Se molte applicazioni collegate staticamente vengono eseguite sullo stesso sistema, le librerie standard non verrebbero riutilizzate, poiché ogni applicazione contiene al suo interno una copia di tutto. (Prova du -sh /usr/lib per capire l'entità del problema.)

Prova a scavare negli archivi delle liste di posta LKML e glibc di 10-15 anni fa. Sono abbastanza sicuro che molto tempo fa ho visto qualcosa di correlato su LKML.


Linux
  1. Come gestire le librerie dinamiche e statiche in Linux

  2. Come aggiungere un nuovo percorso statico su RHEL7 Linux

  3. Comando Linux mv

  4. collegamento <iostream.h> in Linux usando gcc

  5. Collegamento dinamico - Linux Vs. finestre

Come impostare un indirizzo IP statico in CentOS Linux

Come impostare un indirizzo IP statico in Rocky Linux

Come configurare un indirizzo IP statico su Alpine Linux

Come configurare Linux come router statico

Linux vs Unix

Come configurare l'indirizzo IP statico su un sistema Linux