Undefiniertes Symbol beim Versuch, eine Bibliothek mit dlopen zu laden

8

Ich versuche eine shared library (plugin) zu laden, die ich unter einer Linux ARM-Plattform mit dlopen zur Verfügung gestellt habe (closed source). Ich versuche, diesen Weg zu laden:

%Vor%

Das Ergebnis ist ein Fehler mit dieser Nachricht:

%Vor%

Ich habe versucht, mit nm in die Bibliothek zu schauen, aber es scheint, als wäre die Bibliothek leer, kein Symbol konnte gefunden werden. Ich habe auch versucht, readelf -s zu verwenden, und tatsächlich habe ich dieses Ergebnis erhalten:

%Vor%

Wenn ich herum lese, bekomme ich, dass reelelf -s alle Symbole zurückgibt, einschließlich jener Symbole, die in Bibliotheken definiert sind, auf die sie verweist.

Die Antworten zu diese Frage sind mir nicht ganz klar: ist das ein symbol, das in der bibliothek sein soll und das nicht da ist, weil es falsch zusammengestellt wurde oder ist das ein symbol, das ich woanders finden soll? Die Ausgabe von readelf -d scheint darauf hinzudeuten, dass ich alle benötigten gemeinsamen Bibliotheken zur Verfügung stelle. Kann dieser Fehler mit einem Fehler in der Art zusammenhängen, wie ich meine ausführbare Datei kompiliere, oder ist das etwas, das nicht mit dem Ladeprogramm zusammenhängt?

Ich lese auch über die Bedeutung jeder Spalte, aber diese Werte sind ziemlich seltsam. Wie interpretierst du diese Symbolbeschreibung? Warum ist Adresse 0? Warum gibt NOTYPE ein?

    
Luca Carlon 03.12.2011, 00:50
quelle

1 Antwort

4

undefiniertes Symbol: X bedeutet immer, dass X aus einer der geladenen Bibliotheken exportiert werden sollte, aber nicht. Sie sollten herausfinden, in welcher Bibliothek das angeforderte Symbol ist und eine Verbindung zu ihm herstellen.

Sie sollten wissen, dass diese Nachricht immer ein Problem mit der Bibliothek ist, es ist kein Fehler. Die Bibliothek sollte wissen, wie sie alle ihre Symbole bekommt. Wenn dies nicht der Fall ist, können Sie Ihre ausführbare Datei mit der erforderlichen Bibliothek verknüpfen. Wenn Sie also Ihr Plugin laden, ist das angeforderte Symbol bereits bekannt.

Dieser Fehler hat möglicherweise einen komplexeren Grund. Wenn sowohl das Plugin als auch die Haupt-App mit der Bibliothek verlinken, können Versuche, sie zu verlinken, mit undefinierten Symbolen enden. Dies kann passieren, wenn die Haupt-App und das Plugin eine andere Version der Bibliothek benutzen (nämlich das Plugin verwendet eine neuere Version). Dann wird beim Laden des Plugins bereits eine ältere Version geladen, so dass Loader annimmt, dass alles in Ordnung ist, aber neuere Versionen könnten neue Symbole enthalten. Wenn das Plugin sie verwendet, erhalten Sie undefinierte Symbolfehler.

    
j_kubik 03.12.2011, 03:39
quelle