Влияет ли опция gcc wrap на функцию printf?
Я написал функцию обтекания, чтобы заменить printf
из stdio.h
, Я обнаружил, что wrap
вариант работал на функции в stdlib.h
, лайк malloc
или же exit
, Но это не сработало на printf
или же fprintf
,
Есть ли вариант wrap
оказывает влияние на функции в stdio.h
? И как я могу обернуть произвольную функцию? Я не могу получить полезное руководство из документа ld.
Вот код:
//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;
}
2 ответа
Если вы хотите, чтобы это работало правильно для fprintf
нужно также добавить флаг -fno-builtin-fprintf
в командной строке. В противном случае, gcc оптимизирует вызов fprintf
вместо того, чтобы позвонить fwrite
и компоновщик не увидит вызов fprintf
обернуть.
В общем, чтобы правильно обернуть любую функцию, вам может понадобиться -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;
}