2016-07-15 5 views
0

Ich habe eine Shared-Objekt-Datei von Drittanbietern (Bibliotheksdatei) a.so, aber wenn ich tut ldd -d -r a gibt es viele undefinierte Symbole wie undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE. Ich überprüfte und googelte und fand heraus, dass dieses Symbol vom Standard libstdc++ stammt. Also, um diese a.so Arbeit zu machen, tat ich folgendes: g++ -fPIC -static-libgcc -L. -shared -o liba.so -Wl,-soname,liba.so -L. a.so Jetzt, wenn ich ldd -d -r liba mache, bekomme ich alle Referenzen. Aber hier ist das Problem, ich möchte liba.so mit meiner Anwendung teilen, die auf anderen Linux-Rechner läuft, wo a.so nicht von liba.so gefunden wird. Gibt es einen Weg, wo ich undefinierte Symbole entfernen kann, indem ich Standardbibliotheken und die bereitgestellte gemeinsam genutzte Bibliothek von Drittanbietern in ein einzelnes gemeinsames Objekt einfüge und welche ich benutzen kann?Wie libgcc zu .SO-Datei

+0

Verwenden Sie das Dienstprogramm 'nm', um herauszufinden, woher dieses Symbol kommt: 'libgcc_s.so' ist nicht der Asnswer, da es keine C++ - verwandten Symbole enthält. (Meine Schätzung ist libstdC++. So) –

+0

Danke !! Ja, Ihre Vermutung ist richtig, es ist libstdC++. Also – user2018303

+0

Haben Sie tatsächlich diese "a.so" und erfahrene Probleme getestet? Welche Fehlermeldungen haben Sie erhalten? (Wurde das Hauptprogramm in C++ geschrieben? C++ - Plugins können nur aus C++ - Hauptprogrammen verwendet werden) –

Antwort

0

Gibt es einen Weg, wo ich undefinierte Symbole durch Hinzufügen von Std-Bibliotheken und bereitgestellten Shared-Bibliothek von Drittanbietern in einzelnen gemeinsamen Objekt entfernen kann und die ich verwenden kann?

No. muss weiter UNIX-Systeme (mit Ausnahme von AIX) die .so ist ein endgültiges Produkt des Linkers und weitere Verbindung Manipulation ist nicht möglich.

Nun scheint Ihr tatsächliches Problem zu sein, dass libthird_party.so keine Abhängigkeit zu libgcc_s.so.1 in seinem .dynamic Abschnitt hat. Es kann möglich sein, diese Bibliothek mit ELF Bearbeitungswerkzeugen, wie elfshlink Binär-Patch.

Schließlich haben Sie wahrscheinlich nicht ein Problem zu lösen in erster Linie. Da Sie diese Bibliothek mit Ihrer eigenen ausführbaren Datei versenden, solange die ausführbare Datei selbst mit libgcc_s.so.1 verknüpft ist, werden die Symbole, die die Bibliothek der dritten Partei erfordert, trotzdem vorhanden sein.

+0

Der Java-Code 'System.loadLibrary (libthird_party.so)' wird zuerst aufgerufen und dann meine eigene ausführbare Datei. Ich muss beide Bibliotheken laden. Beim ersten Laden selbst bekomme ich Fehler. – user2018303

+0

@ user2018303 Ihr Kommentar macht keinen Sinn. Was hat Ihre ausführbare Datei mit Java zu tun? –