Es gibt zwei Argumente für gemeinsam genutzte Bibliotheken:
- Es hilft, Speicherplatz zu reduzieren.
- Wenn eine gemeinsam genutzte Bibliothek aktualisiert wird, werden alle davon abhängigen Binärdateien aktualisiert.
Es gibt hauptsächlich einen Nachteil für gemeinsam genutzte Bibliotheken:
- Sie können die Abhängigkeitshölle einführen.
Auf Desktop-Computern hält der erste Vorteil nicht mehr wirklich an. Die Verschwendung von Speicherplatz ist heutzutage kein großes Problem.
Mit statischen Binärdateien könnten wir viel bessere Paketmanager finden - ich meine, die Hölle der Abhängigkeit würde der Vergangenheit angehören. Das Hinzufügen eines Programms würde nur das Hinzufügen einer Binärdatei bedeuten. schließlich ein Ordner, damit er seine Dateien verarbeiten kann. Das Löschen eines Programms würde einfach das Löschen dieser Datei bedeuten. Abhängigkeiten? Weg.
Der zweite Vorteil bleibt bestehen, aber ich denke, der Vorteil statischer Binärdateien auf Desktop-Computern überwiegt. Ich meine, sogar neue Sprachen wie Go kompilieren alle ihre Binärdateien trotz der Vorteile der gemeinsam genutzten Bibliotheken aufgrund der Bequemlichkeit.
Sind statische C-Bibliotheken immer noch verpönt, da einer der Hauptvorteile von gemeinsam genutzten Bibliotheken keine große Sache mehr ist? Wenn ja warum?
Antworten:
Die Prämisse Ihrer Frage ist fehlerhaft. Was verpönt ist, ist, sich an Doktrinäre und Absolute zu halten, ohne die Grundlage dahinter zu verstehen (Cargo Cult Programming?).
Die verknüpfte SO-Antwort ist eine interessante Studie zu diesem Thema. In der Frage ging es darum, warum eine Kompilierung mit der Option -static nicht funktioniert. Die Antwort, mit der Sie verknüpft haben, war nichts anderes als ein Schimpfen darüber, keine statische Verknüpfung zu verwenden. Wenn nicht diskutiert wird, warum es schlecht ist, und verlangt, dass das OP dynamische Verknüpfung verwendet. Es ist bedauerlich, dass es als die richtige Antwort markiert ist (die folgende Antwort hat doppelt so viele Stimmen und ist die richtige Antwort auf die Frage des OP), denn obwohl die richtige Antwort da ist, ist sie tief in einer dogmatischen Meinung verborgen.
Die eigentliche Frage ist, was die Vor- und Nachteile einer statischen oder dynamischen Verknüpfung sind und wann eine der anderen vorgezogen wird.
quelle
Aus Entwicklersicht kann die dynamische Verknüpfung Ihre Kompilierungs- / Verknüpfungs- / Testschleife häufig erheblich beschleunigen.
Nehmen Sie zum Beispiel aus Sicht der Paketverwaltung libGL. Ich habe ungefähr ein Dutzend verschiedene Implementierungen davon in meinem Paketmanager, einige generische und einige zielgerichtete Grafikkarten. Wenn es nicht dynamisch verknüpft wäre, müsste es ein Dutzend Versionen jedes Programms geben, das mit libGL verknüpft ist, oder Sie müssten eine zusätzliche Abstraktionsebene entwickeln, die nicht so effizient ist wie ein Funktionsaufruf.
Denken Sie an ein Sicherheitsproblem in einer beliebten Bibliothek wie Qt. Mit der dynamischen Verknüpfung kann ich nur dieses eine Paket aktualisieren, anstatt jedes einzelne Paket, das in Qt verknüpft ist, identifizieren, neu kompilieren und bereitstellen zu müssen.
Statische Verknüpfungen können in unabhängig bereitgestellten Closed-Source-Anwendungen Vorteile haben, aber in der Open-Source-Paketverwaltung tut es mehr weh als hilft.
quelle
Freigegebene Bibliotheken werden von Linux- Distributionsbetreuern aus dem zweiten Grund stark bevorzugt . Für sie ist es sehr wichtig, dass jemand, der beispielsweise einen Sicherheitsfehler in zlib findet , nicht jedes einzelne Programm, das zlib verwendet, neu kompilieren muss - dies würde ihn nicht nur mehr CPU-Zyklen kosten Beim erneuten Kompilieren müsste dann jeder, der die Distribution verwendet, alle diese Programme erneut herunterladen . In der Zwischenzeit ist die Abhängigkeitshölle innerhalb der von einer Distribution bereitgestellten Pakete kein Problem, da alles getestet wurde, um mit diesen Bibliotheken zu funktionieren.
Wenn Sie Software von Drittanbietern erstellen , die Bibliotheken benötigt, die nicht in Ihrer Distribution enthalten sind, ist das statische Verknüpfen dieser Bibliotheken möglicherweise weniger problematisch als die Alternative, und das ist in Ordnung.
Die andere wichtige Sache zu wissen ist, dass sowohl GNU
libc
als auch GCClibstdc++
Komponenten haben, die nicht zuverlässig funktionieren, wenn die Bibliothek statisch verknüpft ist. Das häufigste Problem istdlopen
, dass das Modul, mit dem Sie laden,dlopen
selbst dynamisch verknüpft istlibc.so.6
. Das bedeutet, dass Sie jetzt zwei Kopien der C-Bibliothek in Ihrem Adressraum haben, und es kommt zu Heiterkeit, wenn sie sich nicht einig sind, welche Kopie der internenmalloc
Datenstruktur (zum Beispiel) maßgeblich ist. Es kommt noch schlimmer: eine ganze Reihe von Funktionen , die scheinen zu haben nichts mit dem zu tundlopen
, wiegethostbyname
undiconv
, Verwendungdlopen
intern (damit ihr Verhalten zur Laufzeit konfigurierbar ist). Glücklicherweise ist das ABI für libc und libstdc ++ sehr stabil, sodass es unwahrscheinlich ist, dass Sie auf Probleme stoßen, wenn Sie diese dynamisch verknüpfen.quelle
Ich stimme dem letzten Punkt von mattnz zu: Diese Frage ist eine geladene Frage. Es wird davon ausgegangen, dass die statische Verknüpfung schlecht ist. Ich kann mir zwei Gründe vorstellen, warum dies nicht der Fall ist:
Statische Verknüpfungen sind sicher: Wenn eine gemeinsam genutzte Bibliothek so aktualisiert wird, dass eine Anwendung die neue verwendet (möglicherweise überschreibt die neue die alte oder die alte wird entfernt), kann das Risiko bestehen, dass die neue Version die Anwendung beschädigt. Dies ist eine Codeänderung außerhalb des Umfangs eines offiziellen Updates für die Anwendung. Es wurde möglicherweise nicht getestet. Die statische Verknüpfung umgeht dies, indem Bibliotheken nicht extern freigegeben werden. Ich bin der Meinung , dass dies aufgrund dieses Risikos ein Nachteil für gemeinsam genutzte Bibliotheken ist. Was ist, wenn eine neue Version einer gemeinsam genutzten Bibliothek einen neuen Fehler einführt, der bestimmte ältere Anwendungen beschädigt?
Durch statische Verknüpfung wird sichergestellt, dass eine Anwendung eigenständiger ist. Während gemeinsam genutzte Bibliotheken mit der primären ausführbaren Datei zusammengestellt werden können, werden sie häufig an gemeinsam genutzten Speicherorten abgelegt. Statisch verknüpfte Anwendungen lassen sich leichter als "portabel" im Sinne von "keine Änderungen an Dateien, Verzeichnissen oder Einstellungen des Betriebssystems erforderlich" (z. B. Windows-Verzeichnis, Registrierung usw.) sicherstellen.
quelle
Statische und dynamische Bibliotheken haben jeweils ihre eigenen Verwendungszwecke. Wenn wir eine einzelne Anwendung im Umfang betrachten, erhalten wir eine andere Vorstellung davon, was notwendig ist und was nicht.
Die statische Verknüpfung vereinfacht die Anwendungsbereitstellung drastisch. Keine unterschiedlichen Versionen erkennen und damit umgehen müssen. Einfach backen und bereitstellen.
Der offensichtliche Vorteil dynamischer Bibliotheken ist die Möglichkeit, Aktualisierungen unabhängig anzuwenden.
Dies ist einer der Gründe, warum ich Maven und andere ähnliche Builder für dynamische Verknüpfungsprojekte für Java verabscheue. Sie erwarten, dass eine einzelne Bibliotheksversion für immer und ewig unter einer bestimmten URL verfügbar sein wird. Das Problem, das in 10 Jahren auftritt, wenn niemand die Anwendung kompilieren kann, weil alle Quellen und Gläser verschwunden sind, wird nicht verstanden.
quelle
FooLib1.8
den Code für diese Bibliothek verwenden, auf standardmäßige Weise in ihr ausführbares Paket aufgenommen werden können, damit ein mitgeliefertes Upgrade-Dienstprogramm einFooLib1.9
Upgrade oder Downgrade durchführen kann? Die Art und Weise, wie Code in Classic Macintosh gespeichert wurde, hätte dies ziemlich einfach gemacht. Gibt es einen Grund, warum heutige Systeme dies nicht noch besser können sollten?