如何使用LD_PRELOAD包装可变参数函数?

ank*_*ain 5 c variadic-functions dynamic-linking dlsym ld-preload

我必须对以下格式的可变参数执行动态链接:

int foo(char *args, const char *f, ...)
Run Code Online (Sandbox Code Playgroud)

这里参数的数量是可变的。我想要实现的是我想将获得的参数传递给我使用dlsym解决的原始函数。如果我不传递所有参数,则会不断出现细分错误。提前致谢。

Lor*_*ond 4

我认为您的问题与 LD_PRELOAD 或 dlopen/dlsym 无关:您只想从可变参数函数调用可变参数函数,例如:

int printf (const char *fmt, ...) {
    return fprintf (stdout, fmt, my_variadic_parameters);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是不可能的,但是在精心设计的库中(这显然是其中的少数),每个可变参数函数都有一个使用参数的对应函数va_list,例如 printf 和 vprintf、fprintf 和 vfprintf:

int printf (const char *fmt, ...) {
    va_list ap;
    int retval;

    va_start (ap, fmt);
    retval= vfprintf (stdout, fmt, ap);
    va_end (ap);
    return retval;
}

int vmyprintf (const char *fmt, va_list pap) {
    va_list ap;
    int retval;

    va_copy (ap, pap);
    retval= vfprintf (stdout, fmt, ap);
    va_end (ap);
    return retval;
}
Run Code Online (Sandbox Code Playgroud)

所以你应该要求“foo”的创建者创建一个“vfoo”:

int vfoo (char *args, const char *f, va_list v)
Run Code Online (Sandbox Code Playgroud)

  • 在源代码中找到了函数 vfoo() ,并且使用它,我能够得到我的解决方案......非常感谢! (2认同)