Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

程序启动

在程序启动时,运行时系统将为主线程创建 TLS。

首先,运行时链接程序以逻辑方式将所有已装入动态目标文件(包括动态可执行文件)的 TLS 模板合并成单个静态模板。在合并的模板中,为每个动态目标文件的 TLS 模板指定一个偏移 tlsoffsetm,如下所示。

  • tlsoffset1 = round(tlssize1, align1 )

  • tlsoffsetm+1 = round(tlsoffsetm + tlssizem+1, alignm+1)

tlssizem+1alignm+1 分别是动态目标文件 m 的分配模板的大小和对齐方式。其中,1 <= m <= M,而 M 是已装入动态目标文件的总数。round(offset, align) 函数返回一个偏移,该偏移向上舍入为最接近 align 倍数。

接下来,运行时链接程序将计算启动时为 TLS 分配的总大小 tlssizeS。此大小等于 tlsoffset M,加上 512 个字节。这额外的 512 个字节为静态 TLS 引用提供了一个备份预留空间。执行静态 TLS 引用的共享目标文件在进程初始化后将装入并指定到该备份预留空间。但是,该预留空间的大小是固定的、有限的。此外,该预留空间只能为未初始化的 TLS 数据项提供存储空间。为实现最大的灵活性,共享目标文件应使用动态的 TLS 模型引用线程局部变量。

与计算得出的 TLS 大小 tlssizeS 关联的静态 TLS 块将紧排在进程指针 tpt 之前放置。对 TLS 数据的访问基于 tpt 减法。

静态 TLS 块与一份链接的初始化记录列表相关联。此列表中的每条记录都描述一个已装入动态目标文件的 TLS 初始化映像。每条记录都包含以下字段:

  • 指向 TLS 初始化映像的指针。

  • TLS 初始化映像的大小。

  • 目标文件的 tlsoffsetm

  • 指示目标文件是否使用静态 TLS 模型的标志。

线程库使用此信息为初始线程分配存储空间。此存储空间初始化后,会为初始线程创建动态 TLS 向量。