在程序启动时,运行时系统将为主线程创建 TLS。
首先,运行时链接程序以逻辑方式将所有已装入动态库(包括动态可执行文件)的 TLS 模板合并成单个静态模板。在合并的模板中为每个动态库的 TLS 模板指定一个偏移 (tlsoffsetm),如下所示。
tlsoffset1 = round(tlssize1, align1 )
tlsoffsetm+1 = round(tlsoffsetm + tlssizem+1, alignm+1)
tlssizem+1 和 alignm+1 分别是动态库 m 的分配模板的大小和对齐方式。其中,1 <= m <= M,M 是已装入动态库的总数。round(offset, align) 函数返回向上舍入为最接近 align 倍数的偏移。TLS 模板正好放置在线程指针 tpt 的前面。根据从 tpt 中减去的数字访问 TLS 数据。
接下来,运行时链接程序将计算启动时为 TLS 分配的总大小 tlssizeS。此大小等于 tlsoffsetM。
然后,运行时链接程序构造初始化记录的链接表。此列表中的每条记录都描述一个已装入动态库的 TLS 初始化映像。每条记录都包含以下字段。
指向 TLS 初始化映像的指针。
TLS 初始化映像的大小。
目标文件的 tlsoffsetm。
指示目标文件是否使用静态 TLS 模型的标志。
线程库使用此信息为初始线程分配存储空间。将初始化此存储空间,并为初始线程创建动态 TLS 向量。