ZHCADC4A September 2011 – March 2014
在静态可执行文件 TLS 模型中,需要调用函数 __c6xabi_get_tp() 以获取当前线程的线程指针值。如果使用了线程库,则由它负责提供此函数。
线程库知道它所创建线程的 TLS 块的地址。但是,主线程不由线程库创建,因此线程库需要一种标准方法来查找主线程的 TLS 块的地址。如前所述,静态链接器会定义符号 __TI_TLS MAIN_THREAD_BASE,以用于此目的。
TI RTS 为 __c6xabi_get_tp() 函数提供以下定义:
extern __attribute__((weak)) far const void * __TI_TLS_MAIN_THREAD_Base;
__attribute__((weak)) void * __c6xabi_get_tp(void)
{
return &__TI_TLS_MAIN_THREAD_Base;
}
该函数被定义为“弱”函数,因此将使用线程库中的强定义(如果存在)。
我们来考虑一种不太可能的情况,即用户声明线程局部变量,但不包含线程库。显然,它们无法创建任何新线程。但是,主线程应该会起作用,并且主线程的线程局部变量应该可以访问。在这类情况下,前面提到的 RTS 函数会被链接进来,并提供对主线程的 TLS 的访问。