链接程序和库指南

延迟分配线程局部存储块

在动态 TLS 模型中,当线程 t 需要访问目标文件 m 的 TLS 块时,代码将更新 dtvt 并执行 TLS 块的初始分配。线程库将提供以下接口以便动态分配 TLS。

typedef struct {

    unsigned long ti_moduleid;

    unsigned long ti_tlsoffset;

} TLS_index;



extern void * __tls_get_addr(TLS_index * ti);     (SPARC and x64)

extern void * ___tls_get_addr(TLS_index * ti);    (32–bit x86)

注 –

此函数的 SPARC 和 64 位 x86 定义具有相同的函数签名。但是,32 位 x86 版本不使用缺省调用约定来传递栈中的参数。相反,32 位 x86 版本通过更有效的 %eax 寄存器来传递其参数。为了表示将使用此替代调用方法,32 位 x86 函数的名称中有三个前导下划线。


这两个版本的 tls_get_addr() 都检查每线程生成计数器 gent,以便确定是否需要更新向量。如果向量 dtvt 已过时,则例程将更新此向量,可能会重新分配此向量以便为更多项留出空间。然后,例程将检查是否已分配与 dtvt,m 对应的 TLS 块。如果尚未分配此向量,则例程将使用运行时链接程序提供的初始化记录列表中的信息来分配并初始化块。指针 dtv t,m 被设置为指向已分配的块。例程返回一个指向块中的给定偏移的指针。