在使用libumem时,大家可能都有一点好奇,为什么系统会使用libumem封装的malloc,free这些内存管理函数去替换libc中的内存管理函数?其实答案就在malloc.c中的如下代码:
#ifdef __GLIBC__
static void __attribute__((constructor)) umem_malloc_init_hook(void)
{
if (__malloc_hook != umem_malloc_hook) {
umem_startup(NULL, 0, 0, NULL, NULL);
__malloc_hook = umem_malloc_hook;
__free_hook = umem_free_hook;
__realloc_hook = umem_realloc_hook;
__memalign_hook = umem_memalign_hook;
}
}
void (*__malloc_initialize_hook)(void) = umem_malloc_init_hook;
#else
void __attribute__((constructor))
__malloc_umem_init (void)
{
umem_startup(NULL, 0, 0, NULL, NULL);
}
#endif
针对上述代码,我们只需关注#ifdef __GLIBC__......#else这个部分,因为替换libc中的内存管理函数的魔法就在这个部分:

本文探讨了libumem如何利用gcc的__attribute__((constructor))特性在程序启动时自动替换libc的内存管理函数。通过修改__malloc_hook等钩子变量,libumem实现了自定义内存分配策略,详细解释参见GNU C库的相关文档。
最低0.47元/天 解锁文章
2375

被折叠的 条评论
为什么被折叠?



