Linux C 利用鏈接器特性實現打樁函數(替換已有庫函數)

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

 

發佈了12 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章