相关疑难解决方法(0)

在C中转发可变参数函数的调用

在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的辅助函数.

[更新:基于迄今为止提供的答案,似乎存在一些混淆.用另一种方式表达问题:通常,你可以包装一些任意的可变参数函数而不修改该函数的定义.

c variadic

176
推荐指数
6
解决办法
6万
查看次数

链接.so文件中的旧符号版本

在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并且我的构建系统需要.

所以我正在寻找一种方法来告诉链接器采用旧的版本符号.

对我不起作用的替代方案是:

  • 使用asm .symver(在Trevor Pounds博客的Web Archive上看到)因为这需要我确保symver在所有使用memcpy的代码之前,这将是非常困难的(具有第三方代码的复杂代码库)
  • 使用旧库维护构建环境; 仅仅是因为我想在我的桌面系统上进行开发,并且在我们的网络中同步这些东西将会变得很有用.

在考虑链接器所做的所有工作时,实现它似乎并不困难,毕竟它还有一些代码可以找出符号的默认版本.

任何其他与简单链接器命令行具有相同复杂程度的想法(如创建简单的链接描述文件等)也是受欢迎的,只要它们不像编辑生成的二进制文件那样奇怪的黑客...

编辑: 为了保护未来的读者,除了以下的想法,我找到--wrap了链接器的选项,这有时也很有用.

c linux linker gcc ld

43
推荐指数
5
解决办法
3万
查看次数

标签 统计

c ×2

gcc ×1

ld ×1

linker ×1

linux ×1

variadic ×1