Идея LD_PRELOAD
состоит в том, чтобы загрузить общую библиотеку перед исходной общей библиотекой, например, я могу скомпилировать mylib.so
, чтобы загрузить ее перед libc.so
, поэтому, когда процесс хочет использовать printf
, он ищет в so
, которые загружаются один за другим, и находит их в mylib.so
(потому что этот so
был загружен первым) вместо libc.so
, поэтому он использует printf
в mylib.so
вместо printf
в libc.so
.
Я понимаю, почему это работает с функциями, реализованными в so
, например printf
в libc.so
.
Но когда я хочу подключить функцию write
или другую функцию syscall
, почему это работает? Процесс не ищет функцию в so
, он обращается непосредственно к ядру.
Работает ли
LD_PRELOAD
с двоичным файлом, который скомпилирован статически? Почему? В этом воспроизведении https://stackoverflow.com/a/13866611 упоминается, чтоLD PRELOAD
не работает со статически бинарнымиПочему
LD_PRELOAD
работает с динамически скомпилированным двоичным файлом, чтобы перехватывать системные вызовы?
Архитектура ARM.
write
, это не является прямым вызовом системного вызова. Он вызывает оболочку, которая устанавливает системный вызов, а затем перехватывает ядро. Таким образом, LD_PRELOAD может работать, переопределяя вызов оболочки. - person kaylum   schedule 28.02.2020open()
, например, скорее всего, выполняет системный вызовopenat()
. - person Andrew Henle   schedule 28.02.2020write()
реализацию и соответствующую тему. - person artless noise   schedule 28.02.2020