您可以使用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