我写了一个换行函数来替换stdio.h
中的printf
。我发现wrap
选项适用于stdlib.h
中的功能,如malloc
或exit
。但是在printf
和fprintf
上不起作用。
选项wrap
是否对stdio.h
中的函数生效?如何包装一个任意函数?我无法从旧文档中得到有用的指导。
代码如下:
//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
的调用来包装。
一般来说,要正确地包装任何函数,您可能还需要相应的-fno-builtin-
选项。
不带参数(除了格式字符串)的fprintf
被优化为fwrite
。将fprintf
的调用更改为fprintf(stderr, "%sn", "MAIN!");
,包装将生效。
int __real_fprintf(FILE *stream, const char *format, ...);
int main(){
fprintf(stderr, "%sn", "MAIN!");
return 0;
}
int __wrap_fprintf(FILE *stream, const char *format, ...){
__real_fprintf(stderr, "WRAP!n");
return 0;
}