Fehlende C ++ - Linker-Bibliothek beim Ausführen (SONAME-Verhalten)

Ich habe ein Programm erstellt, das zwei gemeinsam genutzte Bibliotheken verwendet (die ich kompiliert habe) und so platziert sind:

<code>/home_directory_where_I_compile_and_run_everything
-->/lib/libjson_linux-gcc-4.4.6_libmt.so
-->/lib/libre2.so.0
</code>

Wenn ich mein Programm kompiliere, gebe ich die relative Position dieser Bibliotheken an den Linker weiter:

<code>g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/libre2.so.0
</code>

Und es kompiliert gut, aber wenn es das Programm ausführt, findet es libre2.so nicht und wenn ich es mit ldd inspiziere, passiert Folgendes:

<code>....
lib/libjson_linux-gcc-4.4.6_libmt.so (0x00007f62906bc000)
libre2.so.0 => not found
....
</code>

Anscheinend erkennt es an, dass der Pfad in libjson relativ ist, in libre2.so.0 jedoch nicht (es schneidet den gesamten Pfad ab und verlässt nur libre2.so.0).

Kann mir jemand sagen, warum das passiert?

Gibt es auch eine Möglichkeit, dies über ein g ++ - Argument zu ändern?

Beste.

* UPDATE * Whoa check das aus! Ich habe den Namen von libre2.so.0 in stuff.so geändert und dann versucht, im Wesentlichen dasselbe wie folgt zu kompilieren:

<code>g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/stuff.so
</code>

Und es scheitert trotzdem; es schlägt nicht nur fehl, es schlägt fehl, weil es "libre2.so.0" nicht finden kann.

Warum?

* UPDATE # 2 *

Ausgabe fürreadelf -d the_program.o

<code>0x0000000000000001 (NEEDED)             Shared library: [lib/libjson_linux-gcc-4.4.6_libmt.so]
0x0000000000000001 (NEEDED)             Shared library: [libre2.so.0]
</code>

Wenn ich nur dafür sorgen könnte, dass [libre2.so.0] stattdessen [lib / libre2.so.0] ist, wäre das in Ordnung.

* UPDATE # 3 *

Wie @troubadour herausfand:

Wenn eine ausführbare Datei mit einem gemeinsam genutzten Objekt verknüpft ist, das ein DT_SONAME-Feld aufweist, versucht der dynamische Linker beim Ausführen der ausführbaren Datei, das im DT_SONAME-Feld angegebene gemeinsam genutzte Objekt zu laden, anstatt den dem Linker zugewiesenen Dateinamen zu verwenden.

Deshalb funktioniert es mit libjson ..... so und nicht mit libre2.so.0. (libjson ..... hat also keinen Eintrag für SONAME).

Und ich habe endlich die genaue Frage gefunden, wonach ich suche:

Gibt es eine Möglichkeit, den gcc-Linker anzuweisen, die SONAME-Einträge in einer gemeinsam genutzten Bibliotheksdatei zu ignorieren und stattdessen auf den spezifischen Dateipfad zu verlinken?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage