2013-01-05 45 views
2

我想要替換默認的malloc並添加一些統計信息以及泄漏檢測和malloc函數的其他行爲。我已經看到了一些其他的如gperftool和jemlloc。他們可以通過鏈接靜態庫來替換默認的malloc。他們怎麼能這樣做?我想實現我的自定義malloc函數。如何通過代碼替換默認的malloc

+0

只寫你自己的'malloc'用正確的簽名功能。鏈接器會更喜歡你的實現到標準的C庫。要在你的函數中分配內存,使用你的操作系統的API(這是...?)。 –

回答

2

你可以環繞原始的malloc。

static void* (*r_malloc)(size_t) = NULL; 

void initialize() { 
    r_malloc = dlsym(RTLD_NEXT, "malloc"); 
} 
void* malloc(size_t size) { 
    //Do whatever you want 
    return r_malloc(bsize); 
} 

但是,不要忘記你也必須環繞calloc和realloc大概。在libc中也有不太常用的功能來分配內存。

要包裝calloc,你需要做一個骯髒的黑客攻擊,因爲dlsym嘗試使用calloc分配內存,但並不真正需要它。

static void* __temporary_calloc(size_t x __attribute__((unused)), size_t y __attribute__((unused))) { 
    return NULL; 
} 
static void* (*r_calloc)(size_t,size_t) = NULL; 

,並在初始化函數補充一點:

r_calloc = __temporary_calloc; 
r_calloc = dlsym(RTLD_NEXT, "calloc"); 
+0

當我以相同的方式換行()時,它失敗。它不工作在免費()。 – gajia

+0

你可以發佈代碼還是我應該盲目猜測? – LtWorf

+0

我發現我的免費()會回憶自己的原因。我忘了檢查參數是否爲NULL。 – gajia