Frage

Aus der Beschreibung in der Dokumentation, scheinen sie das gleiche, außer dass „nicht alle Systeme“ zu tun Unterstützung geteilt und „nur einige Systeme“ symbolisch unterstützen (es ist unklar, ob diese die gleiche Gruppe von Systemen sind):

  

-shared       Produzieren Sie ein gemeinsam genutztes Objekt, das kann dann mit anderen Objekten verknüpft werden, um   bilden eine ausführbare Datei. Nicht alle Systeme   unterstützen diese Option. für vorhersehbare   Ergebnisse, müssen Sie auch die angeben   gleiche Optionen, die verwendet wurden, um   erzeugen Code (-fPIC, -fPIC oder Modell   Suboptionen), wenn Sie diese angeben   Option 1]

     

-symbolic       Bind Verweise auf globale Symbole beim Bau eines gemeinsamen Objekt. Warnen   über ungelöste Referenzen   (Es sei denn durch den Link-Editor außer Kraft gesetzt   Option -Xlinker -z -Xlinker defs).   Nur wenige Systeme unterstützen diese   Option.

Ich vermute, dass der Unterschied in der „Produce ein gemeinsam genutztes Objekt, das dann mit anderen Objekten verknüpft werden können, eine ausführbare Datei zu bilden“ Teil, aber das klingt wie etwas, das gilt für jede Bibliothek ist. Bedeutet es, dass das resultierende gemeinsame Objekt statisch zu verknüpft werden kann?

War es hilfreich?

Lösung

Zusammenfassung: -symbolic verhindert intra Shared Object-Funktion Zwischen

mit gemeinsamen Objekten verknüpfen ermöglicht ein Feature Symbol Zwischen genannt. Die Idee ist, dass man ‚interpose‘ eine neue Definition eines globalen Symbols, so dass es eher genannt wird, dann ist die ‚normale‘ Definition.

Ein klassisches Beispiel ist malloc (). Im häufigsten Fall malloc () in libc definiert. Aber Sie können Ihre eigene Version von malloc dazwischenstellen durch Laden einer Bibliothek, die definiert, dass Symbol, bevor Sie laden libc (die meisten Laufzeit-Linker können Sie LD_PRELOAD auf bestimmte Bibliotheken zu laden, bevor die ausführbare Datei verwenden).

In der Standardeinstellung jede Funktion in einem gemeinsamen Objekt, das nicht statisch ist, ist ein globales Symbol. Aufgrund dessen können beliebige Funktionen innerhalb des gemeinsam genutzten Objekts angeordnet werden. Betrachten wir ein Szenario, in dem ein gemeinsames Objekt Funktion High_level hat () und Behälter_leer () und High_level () ruft Behälter_leer () als Teil davon Implementierung und weder High_level () noch Behälter_leer () sind statische Funktionen.

Es ist möglich, interpose Behälter_leer (), so dass High_level () ruft eine Behälter_leer () von einem anderen freigegebenen Objekt.

Dies ist, wo -symbolic kommt in. Wenn Ihr gemeinsames Objekt erstellen, wird der Linker, dass Behälter_leer sehen () in dem gleichen gemeinsamen Objekt wie High_level definiert ist () und bindet den Anruf, so dass es nicht auf eingefügt werden kann. Auf diese Weise wissen Sie, dass alle Anrufe von einer Funktion in der gemeinsamen Objekt zu einem anderen in dem gleichen gemeinsamen Objekt werden nie auf zwischengeschaltet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top