GCC 4.5 vs 4.4 Verknüpfung mit Abhängigkeiten

8

Ich beobachte einen Unterschied, wenn ich versuche, die gleiche Operation auf GCC 4.4 und GCC 4.5 durchzuführen. Da der Code, mit dem ich das mache, proprietär ist, kann ich es nicht liefern, aber ich beobachte einen ähnlichen Fehler mit diesem einfachen Testfall.

Was ich im Grunde versuche, ist, eine gemeinsame Bibliothek (libb) von einer anderen gemeinsam genutzten Bibliothek (liba) abhängig zu machen. Beim Laden von libb gehe ich davon aus, dass liba ebenfalls geladen werden sollte - obwohl libb nicht unbedingt die Symbole in liba verwendet.

Was ich beobachte ist, wenn ich mit GCC 4.4 kompiliere, bemerke ich, dass die liba geladen ist, aber wenn ich mit GCC 4.5 kompiliere, wird libb nicht geladen.

Ich habe einen kleinen Testfall, der aus zwei Dateien besteht, a.c und b.c. Der Inhalt der Dateien:

%Vor%

Dies ist meine Ausgabe mit verschiedenen Versionen von GCC

%Vor%

Kann jemand erklären, was passiert? Ein weiteres Extra an Informationen ist, dass ldd auf libb.so liba.so auf GCC 4.4, aber nicht auf GCC 4.5 zeigt.

BEARBEITEN

Ich habe test.sh wie folgt geändert:

%Vor%

Dies gab die folgende Ausgabe mit GCC 4.5:

%Vor%     
Arne Bergene Fossaa 04.01.2012, 10:49
quelle

1 Antwort

11

Es scheint Änderungen in der Art und Weise gegeben zu haben, wie DT_NEEDED -Bibliotheken während der Verknüpfung von ld behandelt werden. Hier ist der relevante Teil des aktuellen man ld :

  

Mit --copy-dt-needed-entries dynamische Bibliotheken, die im Befehl erwähnt werden              Zeile wird rekursiv durchsucht, nach ihren DT_NEEDED-Tags zu anderen Bibliotheken, um Symbole aufzulösen, die von der Ausgabebinärdatei benötigt werden. Mit dem              Die Suche nach dynamischen Bibliotheken, die darauf folgen, wird jedoch mit der dynamischen Bibliothek selbst beendet. Es werden keine DT_NEEDED-Verbindungen durchlaufen              um Symbole aufzulösen.

(Teil des Abschnitts --copy-dt-needed-entries ).

Irgendwann zwischen GCC 4.4 und GCC 4.5 (anscheinend findet man hier hier - kann nichts wirklich Autoritatives finden), Der Standardwert wurde von der rekursiven Suche auf keine rekursive Suche geändert (wie Sie es bei den neueren GCCs sehen).

In jedem Fall können (und sollten) Sie es beheben, indem Sie in Ihrem letzten Link-Schritt liba angeben:

%Vor%

Sie können überprüfen, ob diese Linkereinstellung tatsächlich (zumindest teilweise) das Problem ist, indem Sie mit Ihren neueren Compilern und dieser Befehlszeile ausführen:

%Vor%     
Mat 04.01.2012, 11:15
quelle

Tags und Links