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:
/home_directory_where_I_compile_and_run_everything
-->/lib/libjson_linux-gcc-4.4.6_libmt.so
-->/lib/libre2.so.0
Kiedy kompiluję mój program, przekazuję względną lokalizację tych bibliotek do linkera, tak jak poniżej:
g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/libre2.so.0
I kompiluje się dobrze, jednak podczas uruchamiania programu nie znajduje libre2.so, a jeśli sprawdzę go za pomocą ldd, oto co się dzieje:
....
lib/libjson_linux-gcc-4.4.6_libmt.so (0x00007f62906bc000)
libre2.so.0 => not found
....
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:
g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/stuff.so
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
0x0000000000000001 (NEEDED) Shared library: [lib/libjson_linux-gcc-4.4.6_libmt.so]
0x0000000000000001 (NEEDED) Shared library: [libre2.so.0]
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?