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



我写了一个换行函数来替换stdio.h中的printf。我发现wrap选项适用于stdlib.h中的功能,如mallocexit。但是在printffprintf上不起作用。

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

最新更新