Verhindert den Import der Funktion aus der statischen Bibliothek

8

Angenommen, ich habe zwei statische Bibliotheken, die nicht von mir erstellt wurden, und ich habe keine Kontrolle über deren Inhalt.

Bibliothek 1 hat Funktionen:

%Vor%

Bibliothek 2 hat Funktionen:

%Vor%

Beide müssen in eine aufrufende Anwendung eingebunden werden, aber der Namenskonflikt von A() löst Fehler aus.

Gibt es eine Möglichkeit zu sagen "Ignoriere A () von Bibliothek 1 beim Linken" in Linux mit gcc und ld.

    
tpg2114 26.01.2012, 19:55
quelle

1 Antwort

6

Es gibt ein paar Methoden, die ich kenne:

  1. Sie können eine Kopie der Bibliothek erstellen, in der das entsprechende Symbol versteckt ist, und eine Verknüpfung mit der Kopie herstellen. Sie benötigen dazu keinen Zugriff auf eine Quelle für den Bibliothekscode: objcopy kann dies mit der Option --localize-symbol tun. Ich beschreibe, wie man das mit .o files in dieser Antwort zu einer ähnlichen Frage macht, aber die selbe Methode funktioniert genauso gut mit .a Bibliotheken.

  2. Die Option --allow-multiple-definition kann verwendet werden . (Wenn Sie über einen Befehl gcc und nicht direkt mit ld verknüpfen, müssen Sie die Option als -Wl,--allow-multiple-definition angeben.) Dies führt dazu, dass der Linker sich nicht länger um die Mehrfachdefinition kümmern muss Verwenden Sie stattdessen die erste, auf die es trifft - Sie müssen also vorsichtig sein, in welcher Reihenfolge die Bibliotheken in der Befehlszeile angezeigt werden. Der Nachteil ist, dass es sich um eine globale Option handelt. Wenn Sie also andere unerwartete Symbolkonflikte haben, kann es durchaus das Falsche tun, anstatt Ihnen davon zu erzählen.

Matthew Slattery 27.01.2012, 00:58
quelle