拦截和重定向 fcntl 调用

问题描述 投票:0回答:1

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
)?

谢谢!

c variadic-functions dlopen interception
1个回答
0
投票

如何正确正确地编写这样一个拦截器并重定向到libc的底层orig_fcntl(加载了dlsym)?

“实际”实现必须接受任一参数。在大多数系统上,它将在任一类型的相同寄存器(或相同堆栈槽)中传递,因此您可以使用 Andrew Henle 的解决方案:假设最后一个参数是 void *arg,然后将其传递以执行原始

 fcntl
如果您使用的系统中,ABI 根据其类型指定了不同的方式将参数传递给可变参数函数,则您必须仔细阅读 ABI 规范并按照其规定执行操作。

© www.soinside.com 2019 - 2024. All rights reserved.