c – 为什么在换行时用ld包装printf会失败?

我正在尝试使用ld的-wrap选项拦截对printf的调用.我有两个文件:

main.c中:

#include <stdio.h>

int main(void) {
    printf("printing\n");
    printf("printing");
}

printf_wrapper.c:

int __real_printf(const char *format, ...);

int __wrap_printf(const char *format, ...) {
    (void)format;
    return __real_printf("WRAPPED\n");
}

我用以下命令编译:

gcc -Wl,-wrap,printf *.c

当我运行生成的a.out二进制文件时,我得到这个输出:

printing
WRAPPED

如果字符串中有换行符,为什么换行会失败?我检查了系统的stdio.h,printf不是宏.这是使用gcc 5.3.0

最佳答案 使用-fno-builtin选项告诉gcc不要乱用某些指定的函数.所以,如果你添加-fno-builtin-printf它应该工作.通常,它可能会导致编译器错过的一些问题.有关详细信息,请参阅gcc文档,例如
https://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/C-Dialect-Options.html

点赞