gcc 的 wrap 选项对函数 printf 有影响吗?
Does gcc wrap option takes effects on function printf ?
我写了一个换行函数来替换stdio.h
的printf
。我发现 wrap
选项适用于 stdlib.h
中的函数,例如 malloc
或 exit
。但它不适用于 printf
或 fprintf
.
选项wrap
对stdio.h
中的函数有影响吗?以及如何包装任意函数?我无法从 ld document.
获得有用的指南
这是代码:
//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
的调用以换行。
一般来说,要正确包装 any 函数,您可能还需要相应的 -fno-builtin-
选项。
fprintf
没有参数(格式字符串除外)被优化为 fwrite
。将 fprintf
的调用更改为 fprintf(stderr, "%s\n", "MAIN!");
,包装将生效。
int __real_fprintf(FILE *stream, const char *format, ...);
int main(){
fprintf(stderr, "%s\n", "MAIN!");
return 0;
}
int __wrap_fprintf(FILE *stream, const char *format, ...){
__real_fprintf(stderr, "WRAP!\n");
return 0;
}
我写了一个换行函数来替换stdio.h
的printf
。我发现 wrap
选项适用于 stdlib.h
中的函数,例如 malloc
或 exit
。但它不适用于 printf
或 fprintf
.
选项wrap
对stdio.h
中的函数有影响吗?以及如何包装任意函数?我无法从 ld document.
这是代码:
//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
的调用以换行。
一般来说,要正确包装 any 函数,您可能还需要相应的 -fno-builtin-
选项。
fprintf
没有参数(格式字符串除外)被优化为 fwrite
。将 fprintf
的调用更改为 fprintf(stderr, "%s\n", "MAIN!");
,包装将生效。
int __real_fprintf(FILE *stream, const char *format, ...);
int main(){
fprintf(stderr, "%s\n", "MAIN!");
return 0;
}
int __wrap_fprintf(FILE *stream, const char *format, ...){
__real_fprintf(stderr, "WRAP!\n");
return 0;
}