libumem使用和源码分析系列文章(二)

在使用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中的内存管理函数的魔法就在这个部分:

(1)__attribute__((constructor))

__attribute__是gcc的关键字,它允许用户声明一些属性。而constructor属性的含义则是被修饰的函数要在main()函数执行前执行。相对应地,还有一个destructor属性,则是在main()函数结束时执行。这对这个属性的讨论,大家可以参考stackoverflow上的一篇帖子

(2)__malloc_hook,__free_hook,__realloc_hook,__memalign_hook

这些其实是GNU C库提供的一些变量,程序通过修改这些变量,可以达到使用自己定义的malloc,free这些函数的目的。详细的解释可以参考:http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html