pthread中线程是怎么创建的(1)—glibc中的别名机制symver(symbol version)

那天看了看glibc的线程相关的代码之后,又想看看线程的创建过程,今天趁着程序还在跑的功夫看了看glibc和内核代码,简单过了一下,也顺便记录下。
glibc种线程创建是这个文件种来定义的:nptl/pthread_create.c
我们平时使用的时候一般是include pthread.h文件就可以使用pthread_create来创建线程了,但是在这个pthread_create.c文件中居然是直接找不到pthread_create函数的定义的,找到的只是:
__pthread_create_2_0
__pthread_create_2_1
compat_symbol (libpthread, __pthread_create_2_0, pthread_create, GLIBC_2_0);

这样的3个貌似有联系的函数和语句,我的第一个想法:肯定是那里做了define,但是搜遍了代码也没有发现define pthread_create。后来追查了compat_symbol这个函数(他是一个货真价实的define量),找到一个这样的定义:

# define _symbol_version(real, name, version) \
.symver real, name##@##version ASM_LINE_SEP

再查了以下这个.symver标示,才知道,这个关键字是用来在编译的时候根据编译条件来生成一个全局的符号别名到具体实现函数,用法如下:(有两种用法,第二种只可使用一次,第一种可以多次使用)

.symver actual, alias@version

.symver actual, alias@@version

actual是具体的实现函数,alias是别名,后面是版本号,这个主要是针对不同版本时的具体实现函数到别名的映射关系建立。

这里也就创建了pthread_create 到 __pthread_create_2_0的映射,关系,在__pthread_create_2_0中又调用__pthread_create_2_1.