2010-03-08 2 views
7

Angenommen, Sie haben zwei gemeinsame Bibliotheken, lib1.so und lib2.so, die beide statisch mit libcommon.a verknüpft sind. Würde sich der Compiler über eine mehrdeutige Symbolreferenz beschweren, wenn Sie sowohl lib1.so als auch lib2.so dynamisch verknüpfen würden? Oder wäre der Compiler klug genug zu wissen, dass libcommon Symbole zwischen lib1 und lib2 geteilt werden und es Ihnen erlauben, dynamisch gegen beide zu verlinken?Verknüpfung mit mehreren gemeinsam genutzten Bibliotheken, die alle mit einer gemeinsamen statischen Bibliothek verknüpft sind

Antwort

2

Die statische Bibliothek würde verwendet, um die Links intern aufzulösen, aber die externe Verknüpfung würde nicht an die Shared-Library-Schnittstelle weitergegeben werden, so dass es keinen Konflikt geben würde. Jede gemeinsam genutzte Bibliothek enthält eine eigene Kopie des statischen Bibliothekscodes.

+4

Zumindest unter GNU/Linux, wenn ich eine shared library (.so) erstelle, die eine Verbindung zu einer statischen Bibliothek (.a) herstellt, kann ich auf jedes der aus der statischen Bibliothek gezogenen Symbole von einem ausführbaren Link zugreifen Ich bin mir ziemlich sicher, dass die Symbole aus der statischen Bibliothek _are_ an die gemeinsame Bibliothek weitergegeben werden. Vielleicht funktionieren die Dinge auf einigen anderen Systemen anders, aber die meisten Systeme, mit denen ich gearbeitet habe, sind bei den Standard-Linker-Optionen der Fall. –

+0

@Jay Walker: Für was es wert ist, bevorzugte ich Ihre Antwort. Unabhängig von den Mechanismen ist die grundlegende Wahrheit, dass keine Konflikte auftreten werden. – Clifford

3

Es wird keinen Konflikt geben, da der Linker beim Verbinden mit gemeinsam genutzten Bibliotheken die Definition aus der ersten gemeinsam genutzten Bibliothek verwendet, die das Symbol bereitstellt, und nicht weiter auf die anderen gemeinsam genutzten Bibliotheken schaut. Symbole, die aus der .a-Datei stammen, werden in beiden gemeinsam genutzten Bibliotheken exportiert, stehen jedoch nicht in Konflikt.

+0

Das ist nicht wahr. Es gibt schwach exportierte Symbole und stark. Wenn eine Disambiguität zwischen stark besteht, liegt ein Fehler vor. – Trismegistos

0

Angenommen, die zwei gemeinsam genutzten Bibliotheken sind mit den verschiedenen statischen Bibliotheken verknüpft. Aber die statischen Bibliotheken enthalten beide eine Funktion mit demselben Namen. Es würde Konflikte geben.

Ich bin sicher, weil ich eine tcl/tk-Anwendung habe, lädt es zwei tcl-Bibliotheken (.so). Beide Bibliotheken sind statisch mit der openssl-Bibliothek verknüpft. aber mit anderer Version. Beim Ausführen der tcl-Anwendung ist ein Segmentierungsfehler aufgetreten. Ich führe es in das OpenSSL. In der neuen Version wurde eine Funktionsimplementierung geändert.

Verwandte Themen