加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在Linux上,是由内核还是由libc(或其他语言运行库)设置的TLS?

发布时间:2020-12-13 19:16:46 所属栏目:Linux 来源:网络整理
导读:我正在研究如何在 Linux系统上实现TLS(线程本地存储).文档 ELF Handling for Thread-Local Storage解释了程序对线程局部变量的要求如何在ELF二进制文件中编码,以及“运行时”如何处理这些二进制文件. 但是,我不清楚在实践中,设置TLS区域的“运行时”是Linux
我正在研究如何在 Linux系统上实现TLS(线程本地存储).文档 ELF Handling for Thread-Local Storage解释了程序对线程局部变量的要求如何在ELF二进制文件中编码,以及“运行时”如何处理这些二进制文件.

但是,我不清楚在实践中,设置TLS区域的“运行时”是Linux内核(及其加载ELF二进制文件的代码)还是libc中的一些初始化代码.有人能简单解释一下吗

(背景:我正在尝试静态链接并运行一个应用程序,但它在启动时会出现段错误.在gdb中,我可以看到segfaulting代码是来自libc的一些初始化代码.它试图使用相对于的地址读取静态变量GS,但GS为零.)

解决方法

线程本地存储初始化是libc提供的启动代码的一部分.静态链接时,链接器应将TLS初始化添加到链接到程序中的启动代码中.

例如,glibc在libc.a中有__libc_setup_tls和_dl_tls_setup(以及相关的东西),如果你通过gcc -static链接,它将被添加到程序的初始化代码中. (对于动态链接程序,_dl _…函数是ELF动态链接器加载器ld-linux.so的一部分,它不用于运行静态链接程序.)

因此,静态链接可执行文件中的正确TLS初始化是C库(提供代码)与工具链(必须了解如何正确链接所有必需的启动代码)之间的协作的结果.

内核参与TLS初始化很少. (基本上,它只需要确保.cata部分可用于libc进行初始化.)有关详细信息,请参阅ELF file TLS and LOAD program sections.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读