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?