が提供するラップ機能を使用できます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