Точно так же, как скрипты имеют интерпретатор, заданный с помощью механизма #!
, исключительные ситуации работают аналогично. Исполняемые файлы ELF имеют поле в заголовке программы, тип которого PT_INTERP
, и оно дает путь к «интерпретатору» для исполняемого файла. Этот «интерпретатор» - это динамический линкер c, ld-linux.so
. Этот компоновщик обработает заголовок и отобразит файл в память и все остальное.
Именно этот загрузчик ld-linux.so
реализует функцию LD_PRELOAD
.
Если вы создаете пользовательскую версию этой программы, в которой поддержка LD_PRELOAD
удалена или отключена, а затем укажите заголовок программы вашего исполняемого файла, чтобы использовать этот ld-linux.so
вместо обычного в качестве «интерпретатора», вы сможете победить LD_PRELOAD
.
Если я статически скомпилировал бинарный файл, я услышал, что LD_PRELOAD не будет работать, верно?
Хотя это в основном верно, stati c связывание не поддерживается на Glib c. Сегодня, если вы хотите распространять статически связанный исполняемый файл, вы рассматриваете возможность использования альтернативной C библиотеки , такой как Musl : ", разработанной с нуля для stati c linking, musl тщательно избегайте извлечения большого количества кода или данных, которые приложение не будет использовать. "