Существует ли rpath для динамически подключаемых библиотек?

Если это система Linux, то есть вероятность, что вы locateподдерживаете регулярные выражения:

locate --regex 'A-B.*\.dir$'

Если нет,

locate 'A-B' | grep '\.dir$'

Главное правильно привязать регулярное выражение к концу строки с помощью $.

Обратите внимание, что оба этих варианта также найдут, например,. /some/path/ABBA-Bootlegs/thing.dir.

0
11.04.2020, 10:39
2 ответа

Is there an rpath for dynamic linked libraries?

Да, есть. Вы можете использовать -Wl,-rpathс общими объектами ELF просто как с исполняемыми файлами ELF. Клонируйте небольшой пример, который я выложил здесь:

git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0

Запустите makeдля компиляции. Проверьте, какие библиотеки нужны для mainИсполняемый файл ELF:

$ readelf -d./main

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libtwo.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [.]
(...)

И проверьте, какие библиотеки нужны поlibtwo.so:

$ readelf -d./libtwo.so

Dynamic section at offset 0xe38 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libone.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [libs]
 (...)

Как видите, и main, и libtwo.soнуждаются в некоторых общих объектах. и у обоих установлен rpath. Вам не нужно устанавливать LD _LIBRARY _PATH для запуска./основной:

$./main
I'm in bar()

main всегда будет искать свою зависимость libtwo.so в ., которая является текущий каталог, а libtwo.so, в свою очередь, всегда будет искать его Зависимость libone.so в каталоге libs. Если libsотсутствует./main не заводится:

$ mv libs libs.bak
$./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory

Восстановить:

$ mv libs.bak libs
$./main
I'm in bar()
3
28.04.2021, 23:21

Поскольку вы не хотите рассматривать его как часть системы, используйте его как есть; пользовательское приложение!

Если вы добавите ~/.local/lib/к вашему LD_LIBRARY_PATH, вы сможете поместить туда все. Просто создайте частичную структуру FHS под ~/.local/, например bin , и т. д. , lib и share . Таким образом, вам не нужно вызывать программу с предшествующей переменной окружения. Всем другим системам просто нужно будет добавить этот каталог в свою переменную среды пути к библиотеке. Очень аккуратный и unixish.

Если вы отвергнете и это решение, останется только одна возможность. Либо вы используете фиксированный путь, который ожидается в каждой системе, либо переменную среды, которая содержит путь и также ожидается.

0
28.04.2021, 23:21

Теги

Похожие вопросы