2011-03-31 32 views
0

我已經使用dlsym()調用我的版本的malloc,而不是默認的庫的malloc:Ç - >的malloc - >對dlsym

lt_malloc = (void*(*)(size_t))dlsym(RTLD_NEXT, "malloc"); 
TRACE((stderr, "initialize: lt_malloc=%p\n", lt_malloc)); 
if (!lt_malloc) { 
    fprintf(stderr, "LeakTracer: could not resolve 'malloc' in 'libc.so': %s\n", dlerror()); 
    exit(1); 
} 

現在一定時間後,可能是一個計時器左右,我想要恢復到原始版本的malloc(libc庫malloc)。我怎樣才能做到這一點?

在此先感謝。

回答

0

上面的代碼是否意味着 1)你已經調用了你的malloc malloc? 2)或者您將libc malloc分配給lt_malloc?

上面的代碼表明,lt_malloc是libc malloc,因此是「原始」malloc。那麼你可能比有一些或者一些宏或函數

,那麼你的輕鬆切換爲 my_malloc = libc_malloc my_malloc = my_debug_malloc

,你只需要調用my_malloc

如果不是有幫助,請解釋發佈的代碼以及您期待的「ente codde here」

+0

@Friedrich:請參考dlsym的手冊頁,尤其是使用宏RTLD_NEXT。是的,我們有我們自己的malloc代碼,在將被調用的程序中。 – kingsmasher1 2011-03-31 05:38:27

+0

我知道dlsym做什麼,所以lt_malloc是libc malloc。那麼你的malloc在哪裏呢?什麼是名稱以及如何通過宏或其他函數指針調用它,或者如何調用它? – Friedrich 2011-03-31 06:06:50

+0

不,我認爲在這種情況下,您需要更好地瞭解宏RTLD_NEXT。我將在這裏複製粘貼從手冊頁中的一個例外:'有兩個特殊的僞句柄,RTLD_DEFAULT和RTLD_NEXT。前者將使用默認庫搜索順序查找所需符號的第一個匹配項。後者將在當前庫之後的搜索順序中查找下一個函數。這允許在另一個共享庫中的函數週圍提供一個包裝。' – kingsmasher1 2011-03-31 06:09:45

0

您應該對包含malloc函數的庫使用dlopen,並使用dlopen的句柄作爲dlsym的第一個參數。您也可以use LD_PRELOAD