Linux C 利用鏈接器特性實現打樁函數(替換已有庫函數)
很多時候,可能需要替換已有庫函數,或者對其庫函數進行修改。
爲了避免對那些靜態鏈接庫或者動態鏈接庫文件大動干戈,我們可以使用ld提供的–wrap選項。
例如,想把所有的malloc函數都作修改,以便讓malloc出的內存都是32字節對齊的。
我們可以給ld傳選項“wrap=malloc”, 告訴ld,我們將替換名稱爲malloc的函數。
接着再如下定義一個新的malloc函數:
void * __wrap_malloc( size_t size) {
void* result;
result=memalign(32, size);
return result;
}
可以看到,程序中有個類似庫函數名稱的__wrap_malloc。
ld在遇到__wrap選項後,會使用__wrap_malloc函數名替換所有對malloc的調用。
並以此實現替換的作用。
那麼,如果還想調用原函數怎麼辦呢?
可以使用__real_malloc,這個函數名稱就對應了原來的malloc。
每次調用malloc時都打印生成的指針地址。
void * __wrap_malloc( size_t size) {
void* result;
result= __real_malloc( size);
printf("Malloc: allocate %d byte mem, start at %p", size, result);
return result;
}
附完整程序:
#include <stdio.h>
#include <stdlib.h>
void * __wrap_malloc( size_t size) {
void* result;
//result= __real_malloc( size); result = memalign(32, size);
printf("Malloc: allocate %d byte mem, start at %p", size, result);
return result;
}
int main ()
{
int i,n;
char * buffer;
printf ("How long do you want the string? ");
//scanf ("%d", &i); i = 200;
buffer = (char*) malloc (i+1);
if (buffer==NULL) exit (1);
for (n=0; n<i; n++)
buffer[n]=rand()%26+'a';
buffer[i]='\0';
printf ("Random string: %s\n",buffer);
free (buffer);
return 0;
}
編譯選項:
$gcc test_malloc.c -Wl,--wrap=malloc