При запуске компоновщика C ++ отсутствует библиотека (поведение SONAME)

Я создал программу, которая использует две общие библиотеки (которые я скомпилировал) и размещается так:

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

Когда я компилирую свою программу, я передаю относительное расположение этих библиотек компоновщику, например так:

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

И он прекрасно компилируется, однако при запуске программы не удается найти libre2.so, и если я проверяю его с помощью ldd, вот что происходит:

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

Очевидно, он признает, что путь на libjson относителен, но на libre2.so.0 он этого не делает (он обрезает весь путь и просто оставляет libre2.so.0).

Может кто-нибудь сказать мне, почему это происходит?

Кроме того, есть ли способ изменить это с помощью аргумента g ++?

Лучший.

* UPDATE * Вау проверить это! Я изменил имя libre2.so.0 на stuff.so, а затем попытался скомпилировать по существу так же, как это:

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

И это в любом случае терпит неудачу; он не только терпит неудачу, но и терпит неудачу, потому что не может найти "libre2.so.0".

Whyyy?

* UPDATE # 2 *

Выход дляreadelf -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>

Теперь, если бы я мог просто сделать это [libre2.so.0] как [lib / libre2.so.0], это было бы хорошо.

* UPDATE # 3 *

Как узнал @troubadour:

When an executable is linked with a shared object which has a DT_SONAME field, then when the executable is run the dynamic linker will attempt to load the shared object specified by the DT_SONAME field rather than the using the file name given to the linker.

Вот почему он работает с libjson ..... и не с libre2.so.0. (libjson ..... так что нет записи для SONAME).

И, наконец, я нашел точный вопрос о том, что я ищу:

Is there any way to tell the gcc linker to ignore the SONAME entries on a shared library file and link instead to the specific file path?

Ответы на вопрос(4)

Ваш ответ на вопрос