我写了一个wrap函数来替换printf
的{{1}}。我发现stdio.h
选项适用于wrap
中的函数,例如stdlib.h
或malloc
。但它不适用于exit
或printf
。
选项fprintf
是否会对wrap
中的功能产生影响?我怎么能包装一个任意函数?我无法从ld document获得有用的指南。
以下是代码:
stdio.h
答案 0 :(得分:6)
如果您希望这对-fno-builtin-fprintf
正常工作,您还需要将标志fprintf
添加到命令行。不过,gcc会优化对fwrite
的调用,而不是调用fprintf
,链接器也不会看到对-fno-builtin-
的调用。
通常,要正确包装任何函数,您可能还需要相应的{{1}}选项。
答案 1 :(得分:2)
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;
}