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