Заставить зависимость solib иметь относительный путь нестандартной именованной разделяемой библиотеки в каталоге, используя gcc

У меня есть проблема, связанная со связыванием разделяемой библиотеки с нестандартным соглашением об именах в нескольких каталогах. Мне нужен сгенерированный исполняемый файл для поиска разделяемой библиотеки в текущем местоположении исполняемых файлов, но я не могу найти параметр командной строки, чтобы вызвать это поведение.

Чтобы продемонстрировать это поведение, все, что требуется, это общая библиотека, которая находится в каталоге.

gcc -shared mylib.c -o some/dir/mylib.so

gcc main.c -o main -Lsome/dir -l:mylib.so

Исполняемый файл main дает следующий вывод ldd:

ldd main
     some/dir/mylib.so (0xf76e2000)

Вывод, который мне требуется:

ldd main
     mylib.so => some/dir/mylib.so (0xf7700000)

Этот вывод может быть создан, если библиотека названа условно как libmylib.so, а не mylib.so следующим образом:

mv some/dir/mylib.so some/dir/libmylib.so
gcc main.c -o main -Lsome/dir -lmylib

Это также сбрасывает путь some / dir в списке ldd по мере необходимости.

Я исследовал использование параметров rpath и командной строки как для ld, так и для gcc, но не могу найти удовлетворительного решения. Строгие требования нестандартного имени и структуры каталогов в этом случае не могут быть легко изменены.

Мой вопрос заключается в том, как заставить зависимость библиотеки быть относительно текущей директории, а не абсолютной, как во втором параметре командной строки ldd - gcc.

Спасибо за ваше время, я надеюсь, что объяснил проблему разумно.

Джон.

2 ответа

Попробуйте добавить soname в вашей общей библиотеке:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)

Есть волшебная переменная, которую вы можете передать rpath для этого: $ORIGIN, Увидеть man ld.so для деталей.

Я думаю, что в вашем случае команда должна выглядеть так (не проверено):

gcc main.c -o main -Lsome/dir -lmylib -Wl,-rpath,'$ORIGIN/some/path'

Обратите внимание, что вы не должны допускать расширения оболочки $ORIGIN в качестве переменной оболочки.

Кстати, это был первый хит Google для "родственника rpath".

Другие вопросы по тегам