fcntl
被定义为可变参数函数 int fcntl(int fd, int action, ...)
,有时需要 int
arg,有时需要 void*
arg。
我想为这个 libc 函数编写一个日志拦截器(使用
dlsym(RTLD_NEXT, "fcntl")
)。
罪魁祸首是
int
和 void*
的 arg 类型 sizeof 可能不匹配 - 所以我们不能只是 va_arg
并将其传递下去。如何正确正确地编写这样一个拦截器并重定向到libc底层orig_fcntl
(加载了dlsym
)?
谢谢!
如何正确正确地编写这样一个拦截器并重定向到libc的底层orig_fcntl(加载了dlsym)?
“实际”实现必须接受任一参数。在大多数系统上,它将在任一类型的相同寄存器(或相同堆栈槽)中传递,因此您可以使用 Andrew Henle 的解决方案:假设最后一个参数是 void *arg
,然后将其传递以执行原始
fcntl
。如果您使用的系统中,ABI 根据其类型指定了不同的方式将参数传递给可变参数函数,则您必须仔细阅读 ABI 规范并按照其规定执行操作。