gcc 的 wrap 选项对函数 printf 有影响吗?

Does gcc wrap option takes effects on function printf ?

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

选项wrapstdio.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;
}

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

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

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;
}