Предположим, что у меня есть бинарный файл ELF, связанный динамически, и я хочу переопределить/перенаправить определенные вызовы библиотеки. Я знаю, что могу сделать это с помощью LD_PRELOAD
, но я хочу, чтобы решение было постоянным в двоичном формате, независимо от среды, и это работает для двоичных файлов setuid/setgid, ни один из которых не может достичь LD_PRELOAD
.Патч-код/символы в динамически связанный двоичный файл ELF
Что бы я хотел сделать, это добавить код из дополнительных объектных файлов (возможно, в новых разделах, если необходимо) и добавить символы из этих объектных файлов в таблицу символов двоичного кода, чтобы новая добавленная версия кода вместо кода общей библиотеки. Я считаю, что это должно быть возможно без фактического выполнения каких-либо перемещений в существующем коде; даже несмотря на то, что они находятся в одном файле, они должны быть разрешены во время выполнения на обычном PLT-пути (для чего мне нужно только заботиться о функциях, а не о данных).
Пожалуйста, не дайте мне ответов по строке «Вы не хотите этого делать!» или «Это не переносимо!» То, над чем я работаю, - это способ сопряжения двоичных файлов с небольшими ABI-несовместимыми альтернативными реализациями совместно используемых библиотек. Под этой платформой стоит i386-linux (т. Е. 32-разрядная версия), если это имеет значение. Если я не ошибаюсь в том, что возможно, я мог бы написать некоторые инструменты для анализа файлов ELF и выполнения своих хаков, но я подозреваю, что есть фантастический способ использовать GNU-компоновщик и другие инструменты для этого, не набирая новый код.
Я не знаю, если это что-нибудь для вас, но проверьте системную команду «nm» (возможно, вы уже знаете об этом). Дает довольно много информации о так. – Marm0t
Ничего себе, трюк LD_PRELOAD выглядит забавно! Я тоже ищу способ сделать это в бинарном режиме. Моя проблема заключается в том, что мой двоичный код имеет символ, который не может разрешить компоновщик BeagleBone. – CJxD