Использовать RPATH, но не RUNPATH?
Эта страница - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/ - говорит о порядке поиска библиотек в ld.so:
Unless loading object has RUNPATH:
RPATH of the loading object,
then the RPATH of its loader (unless it has a RUNPATH), ...,
until the end of the chain, which is either the executable
or an object loaded by dlopen
Unless executable has RUNPATH:
RPATH of the executable
LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs
А потом предложите:
Когда вы отправляете двоичные файлы, либо используйте RPATH, но не RUNPATH, либо убедитесь, что LD_LIBRARY_PATH установлен перед их запуском.
Итак, используя RPATH
с RUNPATH
это плохо, потому что RUNPATH
вид отменяет RPATH
так косвенная динамическая загрузка не работает, как ожидалось? Но почему тогда RPATH
осудили в пользу RUNPATH
?
Может кто-нибудь объяснить ситуацию?
3 ответа
Когда вы отправляете двоичный файл, хорошо бы предоставить пользователям возможность приспособить двоичный файл к особенностям их собственной системы, в том числе и к настройке путей поиска в библиотеке.
Пользователь обычно может настроить LD_LIBRARY_PATH
а также /etc/ld.co.conf
оба из которых имеют более низкий приоритет, чем DT_RPATH
то есть вы не можете переопределить то, что жестко закодировано в двоичном файле, тогда как если вы вместо этого используете DT_RUNPATH, пользователь может переопределить его с помощью LD_LIBRARY_PATH.
(FWIW, я думаю, ld.so.conf
также должен иметь приоритет над DT_RUNPATH
но, во всяком случае, по крайней мере, у нас есть LD_LIBRARY_PATH
).
Кроме того, я категорически не согласен с предложением использовать DT_RPATH
, ИМО, лучше всего использовать Пустоты DT_RPATH
не DT_RUNPATH
в отгруженных двоичных файлах.
если
вы поставляете все зависимые библиотеки с вашими исполняемыми файлами и хотите убедиться, что все, что установлено в JustWork(tm) после установки, в этом случае используется DT_RPATH
,
Ответ Чилла совершенно правильный; Я хотел просто добавить немного цвета из недавнего чтения источника glibc ([master 8b0ccb2], в 2.17). Для ясности, если библиотека не найдена в месте, указанном данным уровнем, пробуется следующий уровень. Если библиотека найдена на заданном уровне, поиск останавливается.
Порядок динамического поиска в библиотеке:
- DT_RPATH в двоичном файле ELF, если не установлен DT_RUNPATH.
- LD_LIBRARY_PATH записей, если не setuid / setgid
- DT_RUNPATH в двоичном формате ELF
- Записи /etc/ld.so.cache, если -z nodeflib не указан во время ссылки
- / lib, / usr / lib, если -z nodeflib
- Готово, "не найдено".
Но почему тогда RPATH обесценился в пользу RUNPATH?
Когда DT_RPATH был представлен, он имел приоритет над всеми остальными параметрами. Это сделало невозможным переопределение пути поиска библиотек даже в целях разработки. Поэтому был введен другой параметр, LD_RUNPATH, который имеет более низкий приоритет, чем LD_LIBRARY_PATH.
Более подробную информацию можно найти в работе "Как писать общие библиотеки", написанной Ульрихом Дреппером.