Я пишу инструмент. Частью этого инструмента будет его способность регистрировать параметры системных вызовов. Хорошо, я могу использовать ptrace
для этой цели, но ptrace
работает довольно медленно. Более быстрый метод, который пришел мне на ум, состоял в том, чтобы изменить glibc. Но это становится трудным, поскольку gcc волшебным образом вставляет свои встроенные функции в качестве оберток системных вызовов, чем использование кода, определенного в glibc. Использование -fno-builtin
также не помогает.
Итак, я придумал идею создания разделяемой библиотеки, которая включает в себя каждую оболочку системных вызовов, например mmap
, а затем выполнить регистрацию перед вызовом функции обертки фактического системного вызова. Например, псевдо-код того, как будет выглядеть мой mmap
, приведен ниже.
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
Затем я могу использовать LD_PRELOAD для загрузки первой библиотеки. Считаете ли вы, что эта идея будет работать, или я что-то пропущу?