Влияет ли опция 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;
}
Другие вопросы по тегам