patchelf
Утилита для модификации существующих ELF-исполняемых файлов и библиотек. Она позволяет изменять динамический загрузчик ("ELF interpreter") исполняемых файлов и корректировать пути поиска библиотек (RPATH/RUNPATH). PatchELF широко используется в системах управления пакетами и инструментах упаковки для настройки бинарных файлов после компиляции без необходимости пересборки.
Особенности
- изменение динамического загрузчика (интерпретатора) исполняемых файлов;
- модификация путей поиска разделяемых библиотек (RPATH и RUNPATH);
- добавление, удаление и замена объявленных зависимостей (DT_NEEDED);
- изменение SONAME динамических библиотек;
- сжатие RPATH путём удаления неиспользуемых директорий;
- модификация "на месте" или сохранение результата в отдельный файл;
Основные компоненты
Утилита предоставляет набор опций командной строки для выполнения различных операций над ELF-файлами (подробнее с документацией можно ознакомиться здесь).
Управление динамическим загрузчиком
Интерпретатор позволяет изменить путь к динамическому загрузчику, который используется для запуска исполняемого файла. Это может быть полезно для создания переносимых или изолированных окружений.
Основные опции:
--set-interpreter INTERPRETER— изменение динамического загрузчика исполняемого файла на указанный;--print-interpreter— вывод текущего пути к интерпретатору;--print-os-abi— вывод значения OS ABI из заголовка ELF;--set-os-abi ABI— изменение OS ABI (например, Linux, FreeBSD).
Работа с путями поиска библиотек (RPATH/RUNPATH)
Позволяет управлять путями, по которым динамический загрузчик ищет разделяемые библиотеки. Поддерживаются как устаревший DT_RPATH, так и современный DT_RUNPATH.
Основные опции для работы с путями:
--set-rpath RUNPATH— установка нового пути поиска библиотек;--add-rpath RUNPATH— добавление пути к существующему DT_RUNPATH;--shrink-rpath— удаление из RPATH всех директорий, которые не содержат библиотек, реально используемых файлом (анализ DT_NEEDED);--allowed-rpath-prefixes PREFIXES— совместно с--shrink-rpathпозволяет сохранить определённые префиксы путей;--print-rpath— вывод текущего RPATH или RUNPATH;--remove-rpath— полное удаление RPATH/RUNPATH из файла;--force-rpath— принудительное использование DT_RPATH вместо DT_RUNPATH (по умолчанию DT_RPATH преобразуется в DT_RUNPATH).
Управление зависимостями (DT_NEEDED)
Позволяет добавлять, удалять или заменять записи о необходимых разделяемых библиотеках в секции .dynamic.
Основные опции:
--add-needed LIBRARY— добавление новой зависимости;--remove-needed LIBRARY— удаление существующей зависимости;--replace-needed LIB_ORIG LIB_NEW— замена одной зависимости на другую;--print-needed— вывод списка всех зависимостей (DT_NEEDED).
Изменение SONAME
Позволяет изменить внутреннее имя библиотеки (SONAME), которое записывается в динамический раздел. Это может быть необходимо при создании совместимых версий библиотек.
Опции для работы с SONAME:
--set-soname SONAME— установка нового SONAME для библиотеки;--print-soname— вывод текущего SONAME.
Управление сегментами и дополнительными атрибутами
Позволяет изменять атрибуты, связанные с выполнением и отладкой.
Дополнительные опции:
--print-execstack,--clear-execstack,--set-execstack— управление флагом исполняемого стека (GNU_STACK);--add-debug-tag— добавление тега DT_DEBUG для отладки;--no-default-lib— пометка объекта, что при поиске его зависимостей следует игнорировать стандартные пути поиска библиотек;--page-size SIZE— использование указанного размера страницы вместо стандартного;--rename-dynamic-symbols NAME_MAP_FILE— переименование динамических символов согласно файлу соответствий.