Процесс не ищет функцию в so
, он идет непосредственно в ядро.
Неверно, используемые вами функции системного вызова (read()
, write()
, ...) все lib c оболочки вокруг реальных системных вызовов, даже функция generi c syscall()
. Вот код для функции write()
, например. Единственный способ go напрямую в ядро из вашей программы - вручную запустить системный вызов (см. Ниже).
Работает ли LD_PRELOAD
в двоичном файле, который статически компилируется? Почему?
Нет, это не так. Двоичный файл stati c не нуждается в динамическом разрешении какого-либо символа, поэтому загрузчик динамического c не вызывается для разрешения обычных символов библиотечной функции.
Почему LD_PRELOAD
работает с двоичный файл, скомпилированный динамически для создания ловушек на системных вызовах?
Потому что это обычные функции lib c, не более и не менее.
Единственный способ вручную Для вызова системного вызова без прохождения через библиотеку C (и, следовательно, без выполнения разрешения символов), кроме статической компиляции, используется встроенная сборка . Вы можете взглянуть на man 2 syscall
, чтобы увидеть, какие регистры и инструкции использовать. Например, в ARM AArch64 вы можете вызвать системный вызов, загрузив номер системного вызова в регистр x8
, параметры от x0
до x5
, а затем выполнив инструкцию svc #0
.