【发布时间】:2012-10-04 10:16:08
【问题描述】:
Ulrich Drepper's paper on thread-local storage 概述了几种不同 cpu 架构的 TLS ABI,但我发现它不足以作为实现 TLS 的基础,原因有两个:
- 它省略了一些重要的架构,如 ARM、MIPS 等(同时包括一堆完全不相关的架构,如安腾)
- 更重要的是,它将许多实现细节与 ABI 混合在一起,因此很难区分互操作性需要哪些属性,而哪些只是其实现的方面。
例如,i386 的唯一实际 ABI 要求是:
-
%gs:0指向一个指向自身的指针。 - 主可执行文件的 TLS 段(如果有)必须位于距该地址的固定(由链接器确定为负)偏移处。
- 初始加载的库的所有其他 TLS 段必须有一个运行时常量(即每个线程相同,但不同程序运行之间不一定相同)相对于该地址的偏移量(并且动态链接器必须能够填充在具有这些偏移量的重定位中)。
-
___tls_get_addr和__tls_get_addr函数必须具有正确的语义才能查找任意 TLS 段。
特别是,DTV 的存在或布局不是 ABI 的一部分,除主程序之外,TLS 段的排序/布局也不是。
似乎任何使用“TLS 变体 II”的拱门都大致具有上述 ABI 要求。但是我根本不太了解“TLS 变体 I”的要求,而且从阅读资料(在 uClibc 和 glibc 中)看来,甚至可能存在多个“变体 I”的变体。
是否有更好的文档我应该查看,或者熟悉 TLS 工作原理的人可以向我解释 ABI 要求吗?
【问题讨论】:
-
很抱歉,如果我问的是显而易见的问题,但您检查过
GCCTLS 支持吗?例如,gcc-patches邮件列表从今年 6 月 1 日开始有一个线程,关于添加 MIPS16 TLS 支持 (marc.info/?l=gcc-patches&m=132586147826602)。编译器人员似乎比 C 库开发人员更正式地处理这类事情。他们可能有更好的正式文档。
标签: c linux elf abi thread-local-storage