Когда вы используете компилятор C ++, все имена искажаются.Что это означает, становится понятным, когда вы запускаете nm wrap_malloc.o
, что должно дать вам что-то вроде этого:
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U __Z13__real_mallocj
00000000 T __Z13__wrap_mallocj
U _printf
Это означает, что вы используете ( U ) символ под названием __Z13__real_mallocj
ичто вы определяете символ в текстовом сегменте ( T ) с именем __Z13__wrap_mallocj
.Но вы, вероятно, хотите символ под названием __real_malloc
.Чтобы достичь этого, вы должны сказать компилятору, что __real_malloc
- это функция в стиле C, например:
extern "C" void *__real_malloc(size_t);
extern "C" void *__wrap_malloc(size_t c) {
printf("My malloc called with %d\n", c);
return __real_malloc(c);
}
Теперь вывод nm
:
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U ___real_malloc
00000000 T ___wrap_malloc
U _printf
Вы можете видеть, что имя _printf
не изменилось.Это связано с тем, что в заголовочных файлах многие функции уже объявлены как extern "C"
.
Примечание. Я проделал все вышеперечисленное в Windows в среде cygwin.Вот почему во внешних символах есть дополнительное подчеркивание.