Заставить зависимость 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".