использовать RPATH, но не RUNPATH?

19

Эта страница - Ссылка - описывает порядок поиска в библиотеке в 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 ?

Может кто-нибудь объяснить ситуацию?

    
задан zaharpopov 01.11.2011 в 15:18
источник
  • Я нашел эту статью в обработке cmake для RPATH / RUNPATH, поэтому оставьте ее здесь для следующего googler –  dashesy 11.05.2018 в 00:07

3 ответа

15

Когда вы отправляете двоичный файл, полезно предоставить пользователям возможность приспособить двоичный код к специфике своей собственной системы, среди прочего, корректировать пути поиска библиотеки.

Пользователь может обычно настраивать 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 . IMO, лучше всего использовать neter DT_RPATH not DT_RUNPATH в отгруженных двоичных файлах.

, если

вы отправляете все ваши зависимые библиотеки с вашими исполняемыми файлами и хотите, чтобы вещи JustWork (tm) после установки, в этом случае используйте DT_RPATH .

    
ответ дан chill 06.11.2011 в 16:13
  • проблема, RUNPATH рекомендуется для RPATH, а RPATH устарела, но RUNPATH в настоящее время не поддерживается всеми системами. так что я делаю сегодня, чтобы приложение работало? как показывает статья Qt, при использовании плагинов полезно использовать RPATH больше, чем RUNPATH. поэтому вся ситуация здесь очень запутанная –  zaharpopov 07.11.2011 в 09:50
  • @zaharpopov. Лучшим подходом, который я бы рекомендовал и последую за собой, является создание приложений, которые хорошо интегрированы в целевую платформу, что будет включать, помимо прочего, не распространение конкурирующих версий разделяемых библиотек платформы. Я думаю, что это корень проблемы, а хаки и косые черты вокруг DT_RPATH и друзей - это плохо направленное усилие, пытающееся устранить проблему, а не решать ее. –  chill 07.11.2011 в 10:15
  • это не просто. с проблемой Qt было приложение, которое хочет более новую версию Qt libs, чем существующую в системе. некоторые системы устарели Qt SO, поэтому что бы вы сделали? я думаю, что разумно распределить Qt SO с вами, если вам нужна конкретная версия –  zaharpopov 07.11.2011 в 14:01
  • @zaharpopov, да, это может иметь смысл для поставщиков приложений, которые обычно касаются только собственного приложения, а не общей картины. Но это не имеет смысла с точки зрения поставщиков систем и интеграторов, и именно они устарели DT_RPATH. –  chill 07.11.2011 в 15:06
11

Ответ Чилла в точности прав; Я хотел просто добавить некоторый цвет из недавнего чтения источника glibc ([master 8b0ccb2], в 2.17). Чтобы быть ясным, если библиотека не найдена в местоположении, заданном данным уровнем, будет проверен следующий уровень. Если библиотека найдена на заданном уровне, поиск останавливается.

Порядок поиска динамической библиотеки:

  1. DT_RPATH в двоичном формате ELF, если DT_RUNPATH не установлен.
  2. Записи LD_LIBRARY_PATH, если setuid / setgid
  3. DT_RUNPATH в двоичном формате ELF
  4. /etc/ld.so.cache, если только -z nodeflib указан во время соединения
  5. / lib, / usr / lib, если только -z nodeflib
  6. Готово, «не найдено».
ответ дан FDS 04.06.2013 в 18:21
4
  

Но почему тогда RPATH устарел в пользу RUNPATH?

Когда DT_RPATH был введен, он имел приоритет над всеми другими параметрами. Это сделало невозможным переопределение пути поиска библиотек даже для целей разработки. Поэтому был введен еще один параметр LD_RUNPATH, который имеет более низкий приоритет, чем LD_LIBRARY_PATH.

Более подробную информацию можно найти в «Как писать разделяемые библиотеки ", написанной Ульрихом Дреппером .     

ответ дан MichaelGoren 28.01.2014 в 15:51
  • Этот ответ объясняет необходимость DT_RUNPATH, но не почему DT_RPATH устарел. Оба имеют свое собственное использование, а DT_RUNPATH разбивает libtool при использовании LD_LIBRARY_PATH: bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 –  vinc17 01.06.2017 в 18:27