Linker C ++ brakuje biblioteki podczas uruchamiania (zachowanie SONAME)

Zrobiłem program, który używa dwóch współdzielonych bibliotek (które skompilowałem) i są umieszczone w ten sposób:

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

Kiedy kompiluję mój program, przekazuję względną lokalizację tych bibliotek do linkera, tak jak poniżej:

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

I kompiluje się dobrze, jednak podczas uruchamiania programu nie znajduje libre2.so, a jeśli sprawdzę go za pomocą ldd, oto co się dzieje:

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

Najwyraźniej przyznaje, że ścieżka w libjson jest względna, ale nie robi tego w libre2.so.0 (przycina całą ścieżkę i po prostu pozostawia libre2.so.0)

Czy ktoś może mi powiedzieć, dlaczego tak się dzieje?

Czy istnieje sposób na zmodyfikowanie tego za pomocą argumentu g ++?

Najlepiej.

* AKTUALIZACJA * Whoa sprawdź to! Zmieniłem nazwę libre2.so.0 na stuff.so, a następnie próbowałem skompilować zasadniczo to samo:

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

I tak się nie udaje; nie tylko nie powiedzie się, nie powiedzie się, ponieważ nie może znaleźć „libre2.so.0”.

Dlaczego?

* AKTUALIZACJA # 2 *

Wyjście dlareadelf -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>

Gdybym mógł po prostu sprawić, aby [libre2.so.0] było [lib / libre2.so.0], byłoby dobrze.

* AKTUALIZACJA # 3 *

Jak dowiedział się @troubadour:

Gdy plik wykonywalny jest połączony z obiektem współdzielonym, który ma pole DT_SONAME, to po uruchomieniu pliku wykonywalnego dynamiczny linker spróbuje załadować współużytkowany obiekt określony przez pole DT_SONAME, a nie używając nazwy pliku nadanej łącznikowi.

Dlatego działa z libjson ..... więc nie z libre2.so.0. (libjson ..... więc nie ma wpisu dla SONAME).

I wreszcie znalazłem dokładne pytanie o to, czego szukam:

Czy jest jakiś sposób, aby powiedzieć linkerowi gcc, aby zignorował wpisy SONAME w pliku współdzielonej biblioteki i zamiast tego linkował do określonej ścieżki pliku?

questionAnswers(4)

yourAnswerToTheQuestion