Ulrich Drepper's paper在线程本地存储概述了TLS ABI几个不同的CPU架构,但我发现它不足以作为执行TLS的原因有两个基础:每个cpu arch真正的ELF TLS ABI要求是什么?
- 它省略了许多功能,如ARM重要archs ,MIPS等(同时包括一堆完全无关的Itanium)
- 更重要的是,它将很多实现细节与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的要求吗?
对不起,如果我问明显,但你检查了'GCC' TLS的支持?例如,'gcc-patches'邮件列表在今年6月1日开始有一个关于添加MIPS16 TLS支持的线程(http://marc.info/?l=gcc-patches&m=132586147826602)。与C库开发人员相比,编译器人员似乎对这类内容更为正式;他们可能会有更好的正式文件。 –