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
Antwort
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 elfsh
link 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.
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
@ user2018303 Ihr Kommentar macht keinen Sinn. Was hat Ihre ausführbare Datei mit Java zu tun? –
- 1. Wie Build Libgcc des GCC-Compilers
- 2. clang-3.8 und compiler-rt vs libgcc
- 3. Cross-Compiling für Ziel mit niedrigeren Version von libstdC++/libgcc
- 4. Kompilieren mit -static-libgcc -static-libstdC++ führt immer noch zu einer dynamischen Abhängigkeit von libc.so
- 5. CMake: Verknüpfung statisch gegen libgcc und libstdC++ in einer gemeinsam genutzten Bibliothek
- 6. GCC's -static-libgcc funktioniert nicht mit DYLIB-Bibliotheken unter Mac OS X
- 7. iPhone-Apps stürzen ab, wenn sie auf einem jailbroken iPhone OS 2.2.1 (libgcc-Version?) Getestet wurden
- 8. Wie schreibt man die .so Bibliothek, um existierende C++ .so Bibliothek zu ersetzen?
- 9. Wie man libstdC++ statisch mit clang ++
- 10. Wie man Linker Fehler "definiert in verworfenen Abschnitt" zu beheben?
- 11. Wie zu verwenden Wie zu prüfen, ob eine Übereinstimmung existiert
- 12. Wie Boost zu zwingen, rpath zu verwenden?
- 13. Wie Gurke zu einer Seite zu sagen?
- 14. JavaScript, wie% 20 zu Raum zu ersetzen
- 15. Wie Passwörter zu hacken und zu salzen
- 16. Wie zu konvertieren Postgres JSON zu Integer
- 17. Wie zu stoppen/zu schließen SignalR Service
- 18. Wie zu importieren mysql Dump zu SQLyog
- 19. wie XML zu hashmap zu analysieren?
- 20. Wie von Github zu Bitbucket zu migrieren?
- 21. Wie Observable.flatMap zu warten, um zu lösen
- 22. Wie zu initialisieren java.util.date zu leeren
- 23. Wie alle Buchstaben zu Unterstrich zu ersetzen
- 24. Wie zu Zeitrahmen zu Datetime konvertieren
- 25. Wie log4j zu implementieren/zu verwenden?
- 26. Wie zu verschachtelten Arrays xml zu php?
- 27. Wie "HttpClient" zu Eclipse zu importieren?
- 28. Wie Bitmap zu Base64 String zu konvertieren
- 29. Git - Pushing zu remote, wie zu beheben?
- 30. Wie msbuild zu C# 6 zu aktualisieren?
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) –
Danke !! Ja, Ihre Vermutung ist richtig, es ist libstdC++. Also – user2018303
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) –