为什么在有换行符时用 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
我正在尝试使用 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