Вы можете использовать функцию обтекания, предоставляемую ld
.От man ld
:
--wrap symbol
Использовать функцию обертки для символа.Любая неопределенная ссылка на symbol
будет преобразована в __wrap_symbol
.
Любая неопределенная ссылка на __real_symbol
будет преобразована в symbol
.
Так что вам просто нужноиспользуйте префикс __wrap_
для вашей функции-оболочки и __real_
, когда вы хотите вызвать реальную функцию.Простой пример:
malloc_wrapper.c
:
#include <stdio.h>
void *__real_malloc (size_t);
/* This function wraps the real malloc */
void * __wrap_malloc (size_t size)
{
void *lptr = __real_malloc(size);
printf("Malloc: %lu bytes @%p\n", size, lptr);
return lptr;
}
Тестовое приложение testapp.c
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
free(malloc(1024)); // malloc will resolve to __wrap_malloc
return 0;
}
Затем скомпилируйте приложение:
gcc -c malloc_wrapper.c
gcc -c testapp.c
gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp
Вывод полученного приложения будет:
$ ./testapp
Malloc: 1024 bytes @0x20d8010