У меня есть старый исполняемый файл, который планируется отправить в кучу лома, но его еще нет. Он полагается на некоторые библиотеки, которые были удалены из моей среды, но у меня есть некоторые библиотеки-заглушки, где они работают нормально. Я хочу указать этот исполняемый файл на эти библиотеки-заглушки. Да, я мог бы установить LD_LIBRARY_PATH, но этот исполняемый файл вызывается из многих скриптов и многих пользователей, и я хотел бы исправить его в одном месте.
У меня нет источника для этого, и было бы трудно его получить. Я подумал - могу ли я отредактировать этот файл, используя редактор, поддерживающий ELF, и добавить простой PATH в rpath, чтобы он попал в новые библиотеки? Возможно ли это, или как только вы создаете двоичный файл ELF, вы фиксируете что-то в местах, и их нельзя перемещать?
Ответы:
Есть инструмент,
chrpath
который может это сделать - вероятно, он есть в пакетах вашего дистрибутива.источник
install_name_tool
можно сделать это с-rpath
флагом<binary>: no rpath or runpath tag found.
вы не можете использовать егоchrpath
для его замены, ноpatchelf
в этом случае вы можете использовать :patchelf --set-rpath /path/to/libaries <binary>
Есть средство более универсальное, чем
chrpath
называетсяpatchelf
. Первоначально он был создан для использования при создании пакетов для Nix и NixOS (система упаковки и дистрибутив GNU / Linux).Если в двоичном файле нет rpath (здесь называется rdsamp), происходит
chrpath
сбой:С другой стороны,
удается просто отлично.
источник
patchelf
может добавить rpath к двоичному файлу, который еще не содержит rpath - гдеchrpath
только кажется, что можно изменить уже существующую запись.rpath
иrunpath
. По сути, один может отменять,LD_LIBRARY_PATH
а другой - нет. Подробнее см. Blog.tremily.us/posts/rpathchrpath
иpatchelf
неаккуратно используют свою терминологию. Например,patchelf
показанная выше команда изменится,runpath
ноrpath
только если вы также не предоставите эту--force-rpath
опцию.patchelf
объясняет это: "--set-rpath
,--shrink-rpath
и--print-rpath
теперь предпочитаютDT_RUNPATH
болееDT_RPATH
, что является устаревшим при обновлении, если присутствуют оба, и обновляются Если только DT_RPATH присутствует, он преобразуется в.. ,DT_RUNPATH
Если--force-rpath
не указано Если ни присутствует. ,DT_RUNPATH
добавляется a, если--force-rpath
не указано иное, в этом случаеDT_RPATH
добавляется a ". Название опции, вероятно, осталось без изменений из соображений совместимости.Как сказал @ user7610, правильный путь - это
patchelf
инструмент.Но я чувствую, что могу дать более исчерпывающий ответ, охватывающий все команды, необходимые для этого.
Чтобы прочитать подробную статью по этому вопросу, нажмите здесь
Во-первых, многие разработчики говорят
RPATH
, но на самом деле имеют в видуRUNPATH
. Это два разных необязательных динамических раздела, и загрузчик обрабатывает их по-разному. Вы можете узнать больше о разнице между ними в упомянутой ранее ссылке.А пока просто помните:
RUNPATH
установлено,RPATH
игнорируетсяRPATH
устарел, и его следует избегатьRUNPATH
предпочтительнее, потому что он может быть отмененLD_LIBRARY_PATH
См. Текущий R [UN] PATH
Очистить ПУТЬ R [UN]
Примечания:
RPATH
иRUNPATH
Добавить значения в R [UN] PATH
Примечания:
<desired-path>
это список каталогов, разделенных запятыми, например:/my/libs:/my/other/libs
--force-rpath
, устанавливаетRPATH
, иначе устанавливаетRUNPATH
источник
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
наборыDT_RUNPATH
, и это то, что большинство людей должны использовать.RUNPATH
может быть отмененLD_LIBRARY_PATH
, поэтому людям не следует использовать--force-rpath
.<desired-path>
используется двоеточие; это должна быть запятая (то есть:)/my/libs,/my/other/libs
.Это сработало для меня, заменив XORIGIN на $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
источник