GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Das statische Linken von Linux ist tot?

Ich finde das sehr ärgerlich, und ich finde es arrogant, ein Feature als "nutzlos" zu bezeichnen, weil es Probleme hat, mit bestimmten Anwendungsfällen umzugehen. Das größte Problem beim glibc-Ansatz besteht darin, dass er Pfade zu Systembibliotheken (gconv sowie nss) hartcodiert und daher abbricht, wenn Leute versuchen, eine statische Binärdatei auf einer anderen Linux-Distribution auszuführen als der, für die sie erstellt wurde.

Wie auch immer, Sie können das gconv-Problem umgehen, indem Sie GCONV_PATH so einstellen, dass es auf den entsprechenden Speicherort zeigt. Dadurch konnte ich Binärdateien nehmen, die auf Ubuntu erstellt wurden, und sie auf Red Hat ausführen.


Statisches Linken ist wieder auf dem Vormarsch!

  • Linus Torvalds unterstützt statisches Linken und äußerte sich besorgt über die Menge an statischem Linken in Linux-Distributionen (siehe auch diese Diskussion).
  • Viele (die meisten?) gehen Ausführbare Dateien der Programmiersprache sind statisch gelinkt.
    • Die erhöhte Portabilität und Abwärtskompatibilität ist einer der Gründe für ihre Beliebtheit.
  • Andere Programmiersprachen haben ähnliche Anstrengungen unternommen, um das statische Linken wirklich einfach zu machen, zum Beispiel:
    • Haskell (Ich arbeite an dieser Anstrengung)
    • Zig (Details siehe hier)
  • Konfigurierbare Linux-Distributionen / Paketsätze wie NixOS / nixpkgs machen es möglich, einen großen Teil ihrer Pakete statisch zu verknüpfen (zum Beispiel sein pkgsStatic Paketsatz kann alle Arten von statisch gelinkten ausführbaren Dateien bereitstellen).
  • Statische Verknüpfungen können zu einer besseren Eliminierung von nicht verwendetem Code führen zur Verbindungszeit, wodurch ausführbare Dateien kleiner werden.
  • libcs ​​wie musl statische Verlinkung einfach und korrekt machen.
  • Irgendeine große Software-Industrie Darin sind sich die Führungskräfte einig. Beispielsweise schreibt Google eine neue libc, die auf statische Verknüpfungen abzielt ("statische Nicht-PIE- und statische PIE-Verknüpfung unterstützen"). , "wir beabsichtigen derzeit nicht, in [in] Unterstützung für dynamisches Laden und Verlinken zu investieren" ).

Gibt es in Bezug auf diese Tatsache jetzt einen vernünftigen Weg, einen voll funktionsfähigen statischen Build unter Linux zu erstellen, oder ist statisches Linken unter Linux völlig tot?

Ich weiß nicht, wo ich die historischen Referenzen finden kann, aber ja, statisches Linken ist auf GNU-Systemen tot. (Ich glaube, es starb während des Übergangs von libc4/libc5 zu libc6/glibc 2.x.)

Die Funktion wurde angesichts der folgenden Umstände als nutzlos erachtet:

  • Sicherheitslücken. Eine Anwendung, die statisch gelinkt wurde, unterstützt nicht einmal ein Upgrade von libc. Wenn eine App auf einem System verlinkt wurde, das eine Lib-Schwachstelle enthält, wird sie in der statisch verlinkten ausführbaren Datei fortgesetzt.

  • Code aufblähen. Wenn viele statisch verknüpfte Anwendungen auf demselben System ausgeführt werden, würden Standardbibliotheken nicht wiederverwendet, da jede Anwendung ihre eigene Kopie von allem enthält. (Versuchen Sie du -sh /usr/lib um das Ausmaß des Problems zu verstehen.)

Versuchen Sie, LKML- und glibc-Maillistenarchive von vor 10-15 Jahren auszugraben. Ich bin mir ziemlich sicher, dass ich vor langer Zeit etwas Ähnliches auf LKML gesehen habe.


Linux
  1. Umgang mit dynamischen und statischen Bibliotheken unter Linux

  2. So fügen Sie eine neue statische Route unter RHEL7 Linux hinzu

  3. Linux-mv-Befehl

  4. Verknüpfen von <iostream.h> unter Linux mit gcc

  5. Dynamisches Linken - Linux vs. Fenster

So legen Sie eine statische IP-Adresse in CentOS Linux fest

So legen Sie eine statische IP-Adresse in Rocky Linux fest

So konfigurieren Sie eine statische IP-Adresse unter Alpine Linux

So konfigurieren Sie Linux als statischen Router

Linux gegen Unix

So konfigurieren Sie eine statische IP-Adresse auf einem Linux-System