在C中,是否可以转发可变参数函数的调用?如,
int my_printf(char *fmt, ...) {
fprintf(stderr, "Calling printf with fmt %s", fmt);
return SOMEHOW_INVOKE_LIBC_PRINTF;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,以上述方式转发调用显然不是必需的(因为你可以用其他方式记录调用,或者使用vfprintf),但是我正在处理的代码库要求包装器做一些实际的工作,并且没有没有(并且不能添加)类似于vfprintf的辅助函数.
[更新:基于迄今为止提供的答案,似乎存在一些混淆.用另一种方式表达问题:通常,你可以包装一些任意的可变参数函数而不修改该函数的定义.
在x86_64 linux上使用gcc和ld我需要链接到较新版本的库(glibc 2.14),但可执行文件需要在具有旧版本(2.5)的系统上运行.由于唯一不兼容的符号是memcpy(需要memcpy@GLIBC_2.2.5,但提供memcpy@GLIBC_2.14的库),我想告诉链接器,不应该使用memcpy的默认版本,它应该采用我指定的旧版本.
我发现了一种非常笨拙的方法:只需在链接器命令行中指定旧.so文件的副本即可.这工作正常,但我不喜欢有多个.so文件的想法(我只能通过指定我链接到的所有旧库,也有memcpy的引用)来检查svn并且我的构建系统需要.
所以我正在寻找一种方法来告诉链接器采用旧的版本符号.
对我不起作用的替代方案是:
在考虑链接器所做的所有工作时,实现它似乎并不困难,毕竟它还有一些代码可以找出符号的默认版本.
任何其他与简单链接器命令行具有相同复杂程度的想法(如创建简单的链接描述文件等)也是受欢迎的,只要它们不像编辑生成的二进制文件那样奇怪的黑客...
编辑:
为了保护未来的读者,除了以下的想法,我找到--wrap了链接器的选项,这有时也很有用.