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庫開發人員相比,編譯器人員似乎對這類內容更爲正式;他們可能會有更好的正式文件。 –