Führen Sie mehrere gemeinsam genutzte .so-Bibliotheken zusammen

Lesezeit: 2 Minuten

Angenommen, ich habe a.so und b.so. Kann ich c.so als eine einzige gemeinsam genutzte Bibliothek mit allen von a und b exportierten Funktionen erstellen, wobei natürlich alle Intra-Abhängigkeiten aufgelöst werden (dh alle Funktionen von b.so, die von a.so aufgerufen werden und umgekehrt)?

Ich habe es versucht

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

aber es funktioniert nicht.

Das Gleiche gilt, wenn ich ao und bo in aa und ba archiviere (was ao und bo nicht ändern sollte) und dies tue

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

Vielen Dank

  • Am Ende habe ich auf ein Bibliotheksskript mit einer GRUPPE zurückgegriffen, mit dem ich alle kleinen Bibliotheken als eine einzige anzeigen kann, aber eine Software könnte nur mit der richtigen “Unter” -Bibliothek verknüpfen.

    – Metiu

    28. Mai 2009 um 20:07 Uhr

Das Zusammenführen mehrerer gemeinsam genutzter Bibliotheken zu einer einzigen ist in der Tat auf allen UNIXen praktisch unmöglich, mit Ausnahme von AIX: Der Linker betrachtet die .so-Datei als “endgültiges” Produkt.

Aber das Zusammenführen von Archiven in .so sollte kein Problem sein:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive

  • Vielen Dank für das nützliche Flag: Whole-Archive!

    – Denis Gorodetskiy

    14. Oktober 2011 um 1:25 Uhr

  • Spielt hier die Reihenfolge der Archive eine Rolle? Wenn ich viele .a-Dateien habe, kann ich dann *.a verwenden?

    – Raj

    12. September 2012 um 21:52 Uhr

  • @Raj Nein, die Reihenfolge spielt keine Rolle – sie werden alle vollständig aufgenommen. Wenn Sie keine Symbolredefinitionen in Ihrer *.adann *.a wird einfach funktionieren (TM).

    – Angestellter Russe

    13. September 2012 um 3:04 Uhr

  • @EmployedRussian: Ich habe den obigen Befehl mit g++ ausprobiert, i,e g++ -shared -o c.so -Wl,–whole-archive aa ba -Wl,–no-whole-archive Ich habe die folgende Fehlermeldung erhalten: / usr/bin/ld: nicht erkannte Option ‘-plugin’ /usr/bin/ld: verwenden Sie die Option –help für Nutzungsinformationen collect2: Fehler: ld gab 1 Exit-Status zurück Welche Änderungen muss ich vornehmen?

    – Wein

    11. Juli 2016 um 19:03 Uhr


In der Praxis ist es nicht möglich.

Aus Linker-Sicht ist eine SO-Bibliothek ein Endprodukt, das keine für das Linken erforderliche Verschiebungsinformation enthält.

Wenn Sie Zugriff auf Quell- oder Objektdateien für beide Bibliotheken haben, ist es einfach, daraus ein kombiniertes SO zu kompilieren/linken.

  • “Wenn Sie Zugriff auf Quell- oder Objektdateien für beide Bibliotheken haben, ist es einfach, daraus ein kombiniertes SO zu kompilieren/linken.” — Wie mache ich das ? Insbesondere auf der Android-Plattform.

    – Shaktiman_droid

    4. August 2014 um 20:22 Uhr

1408300cookie-checkFühren Sie mehrere gemeinsam genutzte .so-Bibliotheken zusammen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy