3

我正在尝试 LD_PRELOAD linux 的clone功能。clone在我的 LD_PRELOADed 版本中,我需要在调用原始函数之前记录输入参数。但是,问题在于它clone需要可变数量的参数。它是这样声明的。

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...
/* pid_t *pid, struct user_desc *tls, pid_t *ctid */ );

现在要将这些参数传递给原始clone函数,我必须知道传入的参数数量。我该怎么做?

4

4 回答 4

2

使用va_*函数,这些是使用变量参数列表时要走的路。

这是手册页,最后还包含一个示例。

于 2012-06-25T15:27:47.120 回答
1

如果有 NULL 终止符,您可以va_arg在它不返回时调用NULL

于 2012-06-25T15:33:11.413 回答
1

对此的正确答案是:您无法计算变量参数函数中的参数数量。

但是,对于clone函数,您可以通过查看参数来假设flags参数的数量,因为某些标志需要某些额外的参数。

CLONE_PARENT_SETTID标志为例,它在手册页中指出:

将子线程 ID 存储在父子内存中的位置ptid处。(在 Linux 2.5.32-2.5.48 中有一个标志 CLONE_SETTID 可以做到这一点。)

因此,如果设置了此标志,那么您知道该ptid参数应该存在,并且您可以使用va_*函数来获取它。

但是,没有办法验证用户是否确实传递了参数,这意味着如果用户没有传递,那么事情可能会出现可怕的错误。

于 2012-06-26T04:57:27.890 回答
0

手册页描述了这样的原型:

int clone(int (*fn)(void *), void *child_stack, int flags,
          void *arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *" ctid ");

tls注意:我在和之间添加了一个逗号pid_t,我认为手册页中有错字。

然后它谈论论点ptidctid。所以我会继续检查文档,对于那些定义了这些额外参数的情况,这就是如何从va_list.

于 2012-06-25T15:40:11.137 回答