链接程序和库指南

线程局部存储节

编译时已分配的线程局部数据的独立副本必须与各个执行线程关联。要提供此数据,可使用 TLS 节指定大小和初始内容。

编译环境在使用 SHF_TLS 标志标识的节中分配 TLS。这些节根据存储的声明方式提供已初始化的 TLS 和未初始化的 TLS。

在分配了任何已初始化的节后会立即分配未初始化的节,并进行填充以便正确对齐。合并的节一起构成 TLS 模板,每次创建新线程时,可使用此模板分配 TLS。

此模板的已初始化部分称为 TLS 初始化映像。将由于已初始化的线程局部变量而产生的所有重定位应用于此模板。当新线程需要初始值时,将使用重定位的值。

TLS 符号的符号类型为 STT_TLS。这些符号被指定相对于 TLS 模板的开头的偏移。与这些符号关联的实际虚拟地址无关紧要。地址仅指向模板,不指向每个数据项的每线程副本。

在动态可执行文件和共享库中,对于已定义的符号,STT_TLS 符号的 st_value 字段包含指定的偏移,或者对于未定义的符号,此字段包含零。

定义了多个重定位以支持访问 TLS。请参阅SPARC: 线程局部存储的重定位类型32 位 x86: 线程局部存储的重定位类型x64: 线程局部存储的重定位类型。TLS 重定位仅引用 STT_TLS 类型的符号。

在动态可执行文件和共享库中,PT_TLS 程序项描述 TLS 模板。此模板包含以下成员。

表 8–1 ELF PT_TLS 程序头项

成员 

值 

p_offset

TLS 初始化映像的文件偏移

p_vaddr

TLS 初始化映像的虚拟内存地址

p_paddr

0

p_filesz

TLS 初始化映像的大小

p_memsz

TLS 模板的总大小

p_flags

PF_R

p_align

TLS 模板的对齐方式