我正在追踪malloc()
在GCC中所做的工作。
我从公共malloc void* __libc_malloc(size_t bytes)
函数开始,它调用arena_lookup()
,在arena.c
中找到:
void* __libc_malloc(size_t bytes)
{
mstate ar_ptr;
void *victim;
void *(*hook) (size_t, const void *) = force_reg (__malloc_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(bytes, RETURN_ADDRESS (0));
arena_lookup(ar_ptr);
.
.
}
下面是函数arena_lookup()
,我插入了每个函数的定义,称为(虚线包含每个级别的函数定义):
#define arena_lookup(ptr) do {
void *vptr = NULL;
ptr = (mstate)tsd_getspecific(arena_key, vptr);
//tsd_getspecific-----------------------------------------------------------------------------------------
#define tsd_getspecific(key, vptr) ((vptr) = __libc_tsd_get (void *, MALLOC))
//__libc_tsd_get-----------------------------------------------------------------------------------------
#define __libc_tsd_get(TYPE, KEY)
(*__libc_tsd_address (TYPE, KEY))
//__libc_tsd_address-----------------------------------------------------------------------------------------
#define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY)
//-----------------------------------------------------------------------------------------
} while(0)
我最终libc-tsd.h
__libc_tsd_address(TYPE, KEY)
定义(&__libc_tsd_##KEY)
,但我不明白这段代码是什么意思?
这是标记粘贴或标记串联,如此处所述。它连接预处理器令牌以创建要由 C 编译器处理的新令牌。如果它被称为
__libc_tsd_address(void *, MALLOC)
它扩展到:
&__libc_tsd_MALLOC
或者,如果MALLOC
也是一个定义的宏,则其扩展将在那里被替换。