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

Why does wrapping printf with ld fail when there's a newline?

我正在尝试使用 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