c - 这是拦截系统调用的好方法吗?

标签 c linux gcc x86-64 glibc

我正在写一个工具。该工具的一部分是能够记录系统调用的参数。好吧,我可以为此目的使用 ptrace,但是 ptrace 非常慢。我想到的一个更快的方法是修改 glibc。但这变得越来越困难,因为 gcc 神奇地插入了自己的内置函数作为系统调用包装器,而不是使用 glibc 中定义的代码。使用 -fno-builtin 也无济于事。

所以我想到了编写一个共享库的想法,其中包括每个系统调用包装器,例如mmap,然后在调用实际的系统调用包装器函数之前执行日志记录。例如,下面给出了我的 mmap 的伪代码。

int mmap(...)
{
 log_parameters(...);
 call_original_mmap(...);
 ...
}

然后我可以使用 LD_PRELOAD 首先加载这个库。您认为这个想法行得通吗,还是我遗漏了什么?

最佳答案

您在用户空间中想出的任何方法都无法与任何应用程序无缝协作。对你来说幸运的是,已经支持在内核中做你想做的事情。 Kprobes 和 Kretprobes 允许您检查机器在系统调用之前和之后的状态。

此处的文档:https://www.kernel.org/doc/Documentation/kprobes.txt

关于c - 这是拦截系统调用的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688707/

相关文章:

java - 如何使用使 C 程序部分调用 JNI 中的 .a 库

在C中将字符从字符数组转换为整数

c - 从文件的 inode 号获取文件名

C、Unix 域套接字、辅助数据和 GCC;使用 CMSG_DATA 宏

c - CreateFile() 和 CreateFileA() 有什么区别?

c - FloodFill 函数调用不起作用

linux - 网络映射/mon 工具阻塞 telnet 守护进程/登录进程

c - Memcpy 与 memset 耗时相同

在 GCC 中调试 vtable 链接器错误

c - 优化函数进入/退出 (gcc)