2016-05-11 8 views
0

Ich habe eine Bibliothek, die ich verwenden möchte. Ich habe nicht den Quellcode dafür, aber es enthält eine Funktion, die ich gerne verwenden würde. Es ist ein normales gemeinsames x86-64-Objekt mit etwas JNI-Code und nichts Besonderes. Mein Problem ist jetzt, dass die Bibliothek auf libm.so verweist. Was jetzt passiert, ist ziemlich seltsam und ich habe es nicht erwartet. Wenn ich versuche, es auszuführen, sagt es mir, dass libm.so einen ungültigen ELF-Header hat, was sinnvoll ist, weil libm.so nur eine Referenzdatei zu libm.so.6 ist, die die tatsächliche Bibliotheksdatei ist.Linux Shared Object Library Verknüpfung

Jetzt ist meine Frage, wie man das korrigieren? Ich bin wirklich überrascht, dass das Betriebssystem das nicht richtig beherrscht, da jedes Programm sich auf libm.so und nicht auf libm.so.6 bezieht, da es zumindest etwas versionsunabhängig sein sollte.

EDIT: Ich habe ein strace und libm.so nur die Spitze des Eisbergs zu sein scheint ... Meine Bibliothek ist mit vielen gängigen Standardbibliotheken von Linux verweisen. Und da ich es in der JRE ausführe, sucht es nur im Verzeichnis der JRE und das ist natürlich völlig falsch. Und da die Bibliothek von einer Android-App stammt, hatte das ursprüngliche Makefile wahrscheinlich auch Pfade für die Bibliotheken, die keinen Sinn ergeben ... müssen noch mehr Analysen für diese Frage machen, um sie zu lösen.

+0

Eine Bibliothek, die eine symbolische Verknüpfung zu einer tatsächlichen Datei darstellt, funktioniert wie jede andere symbolische Verknüpfung. Es muss ein anderes Problem geben, das den Fehler verursacht. Wie für den Fehler, können Sie bitte kopieren Sie den tatsächlichen Fehler, vollständig und unbearbeitet, und zeigen Sie es im Fragenkörper? Möglicherweise wird auch die für die Verknüpfung verwendete Befehlszeile angezeigt (es ist die Verknüpfung, die fehlschlägt? Oder schlägt es fehl, wenn Sie versuchen, Ihr Programm auszuführen?). –

Antwort

0

Der Import sollte libm.so.6 sein. Das Importieren von libm.so sollte nur während des Kompilierens erfolgen. Die resultierende ELF sollte die erstgenannte importieren.

Dies wird als ABI-Version bezeichnet. Es soll sicherstellen, dass Sie bei einer Verknüpfung mit einer Bibliothek in einer bestimmten Version nur tatsächliche Importe erhalten, die mit der Version kompatibel sind, mit der Sie verbunden sind. Es gibt etwas komplizierte Regeln, wenn sich diese Zahl ändert (siehe soname für weitere Details).

Leider haben Sie keine tatsächliche Frage gestellt. Dies erklärt nicht, warum Ihr Import fehlgeschlagen ist. Wenn der ELF-Header falsch ist, dann suchen Sie wahrscheinlich (genauer gesagt, senden Sie ld.so, um danach zu suchen) an der falschen Stelle.

Ich würde meinen Code mit strace ausführen, um zu sehen, welche Dateien tatsächlich geöffnet sind. Führen Sie dann file darauf aus, dass die Plattformen übereinstimmen (möglicherweise versucht eine 64-Bit-ausführbare Datei, eine 32-Bit-Bibliothek zu öffnen oder umgekehrt).

+0

Ich analysierte den strace ein bisschen mehr und es sieht tatsächlich so aus, als würde die JRE alle Bibliotheken finden, öffnet sie und schließt sie wieder. Es findet sogar die richtigen Dateien an den richtigen Stellen (es sieht spät aus, aber es schaut nach/usr/lib und es gibt alle x64-lib-Dateien. Ich bin irgendwie zurück, um wieder eins zu machen. – SkryptX

Verwandte Themen