【问题标题】:Does gcc wrap option takes effects on function printf ?gcc wrap 选项对函数 printf 有影响吗?
【发布时间】:2016-08-28 07:43:33
【问题描述】:

我写了一个换行函数来替换stdio.h 的printf。我发现wrap 选项适用于stdlib.h 中的函数,例如malloc 或exit。但它不适用于printf 或fprintf。

wrap 选项是否对stdio.h 中的函数起作用?以及如何包装任意函数?我无法从ld document 获得有用的指导。

代码如下:

//gcc wrap.c -g -Wl,--wrap,fprintf
int __real_fprintf(FILE *stream, const char *format, ...);

int main(){
    fprintf(stderr, "MAIN!\n"); 
    return 0;
}

int __wrap_fprintf(FILE *stream, const char *format, ...){
    __real_fprintf(stderr, "WRAP!\n");
    return 0;
}

【问题讨论】:

  • 要包装可变参数函数,您应该初始化 arg 列表,然后将其传递给例如 v*printf
  • "它不起作用" 你期望什么输出?你得到了什么输出?
  • 已确认不适用于 fprintf。它适用于 malloc。
  • @n.m.我想得到输出“WRAP!”。但它写了“MAIN!”。结果显示包裹不起作用。

标签: c gcc ld


【解决方案1】:

如果您想让 fprintf 正常工作,您还需要在命令行中添加标志 -fno-builtin-fprintf。否则,gcc 将优化对fprintf 的调用以改为调用fwrite,并且链接器将看不到对fprintf 的调用以进行包装。

一般来说,要正确包装 any 函数,您可能还需要相应的-fno-builtin- 选项。

【讨论】:

  • 非常感谢!有用。此外,代码在clang 上正常工作。
【解决方案2】:

fprintf 不带参数(格式字符串除外)被优化为fwrite。将fprintf 的调用更改为fprintf(stderr, "%s\n", "MAIN!");,包装将生效。

int __real_fprintf(FILE *stream, const char *format, ...);

int main(){
    fprintf(stderr, "%s\n", "MAIN!"); 
    return 0;
}

int __wrap_fprintf(FILE *stream, const char *format, ...){
    __real_fprintf(stderr, "WRAP!\n");
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多