每个 CPU 架构的真正 ELF TLS ABI 要求是什么?

2023-11-27

乌尔里希·德雷珀的论文on thread-local storage 概述了几种不同 cpu 架构的 TLS ABI,但我发现它不足以作为实现 TLS 的基础,原因有两个:

  1. 它省略了许多重要的体系结构,如 ARM、MIPS 等(同时包括一堆完全不相关的体系结构,如安腾)
  2. 更重要的是,它将很多实现细节与ABI混合在一起,因此很难分辨哪些属性是互操作性所必需的,哪些只是他实现的方面。

例如,i386 的唯一实际 ABI 要求是:

  • %gs:0指向指向自身的指针。
  • 主可执行文件的 TLS 段(如果有)必须位于距此地址的固定(由链接器确定为负)偏移处。
  • 初始加载的库的所有其他 TLS 段必须具有相对于该地址的运行时常量(即每个线程相同,但在不同程序运行之间不一定相同)偏移量(并且动态链接器必须能够使用以下命令填充重定位):这些偏移量)。
  • ___tls_get_addr and __tls_get_addr函数必须具有正确的语义才能查找任意 TLS 段。

特别是,DTV 的存在或布局是notABI 的一部分,主程序之外的 TLS 段的排序/布局也不是。

似乎任何使用“TLS 变体 II”的架构都大致具有上述 ABI 要求。但我根本不太理解“TLS 变体 I”的要求,而且从阅读源(uClibc 和 glibc 中)看来,“变体 I”甚至可能有几个变体。

我是否应该查看更好的文档,或者熟悉 TLS 工作原理的人可以向我解释 ABI 要求吗?


到目前为止我能收集到的最好的信息是:

对于任一 TLS 变体,__tls_get_addr或其他特定于架构的函数必须存在并且具有用于查找任何 TLS 对象的正确语义,并且任何两个 TLS 段之间的相对偏移量必须是运行时常量(每个线程的偏移量相同)。

对于 TLS 变体 II(i386 等),“线程指针寄存器”(实际上可能不是寄存器,但可能是某种机制,例如%gs:0甚至是进入内核空间的陷阱;为了简单起见,我们将其称为寄存器)点刚刚过去主可执行文件的 TLS 段,其中“刚刚过去”包括向上舍入到 TLS 段对齐的下一个倍数。

对于 TLS 变体 I,“线程指针寄存器”指向距开始主要可执行文件的 TLS 段。此偏移量因牙弓而异。 (在一些丑陋的 RISC 架构上选择它是为了最大化通过签名 16 位偏移量访问的 TLS 数量,这让我觉得非常无用,因为编译器无法知道重定位的偏移量是否适合 16 位,因此必须始终使用加载上部/添加指令生成较慢、较大的 32 位偏移代码)。

据我所知,关于 TCB、DTV 等的任何内容都不是 ABI 的一部分,因为不允许应用程序访问这些结构,除了主可执行文件部分之外的任何 TLS 段的位置也不是 ABI 的一部分。 ABI。在变体 I 和 II 中,将线程的实现内部信息存储在距“线程指针寄存器”的固定偏移处是有意义的,无论哪种方式都可以安全地避免重叠 TLS 段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个 CPU 架构的真正 ELF TLS ABI 要求是什么? 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况

随机推荐

  • 带有 NSFetchedResultsController 的 UITableView 无法第二次加载

    Update 3这些是第一次使用空数据存储运行后的日志 2013 02 07 20 57 06 708 Five Hundred Things 14763 c07 mainMOC
  • Java 中的实时绘图

    我有一个应用程序 它每秒更新变量大约 5 到 50 次 我正在寻找某种方法来实时绘制此变化的连续 XY 图 尽管 JFreeChart 不推荐用于如此高的更新率 但许多用户仍然表示它适合他们 我尝试过使用thisdemo 并修改它以显示随机
  • 带有 RS-232 串行端口的 Javascript 接口

    我目前正在从事一个涉及 4 端口 A V 交换机的项目 该开关可通过 RS 232 进行控制 与交换机连接的计算机运行 Vista 我想创建一个侧边栏小工具 它有 4 个按钮 交换机上的每个端口 1 个 当用户按下按钮时 它会切换到该端口
  • __base__ 不起作用!下一步是什么?

    以下代码在 Python 3 x 中不起作用 但它曾经适用于旧式类 class Extender def extension self print Some work class Base pass Base bases Extender
  • iPhone 6 和 6 plus 给出错误的框架、边界值[重复]

    这个问题在这里已经有答案了 我的应用程序在 Xcode 5 1 1 上构建 但在 Xcode 6 上升级后 面临着新尺寸的帧尺寸问题 iPhone 6 的分辨率为 750x1334 但是 获得输出 480x300 是否有人在 iOS 8 i
  • Tkinter:如何让画布窗口中的框架扩展到画布的大小?

    所以我一直在 tkinter 中使用画布小部件来创建一个充满标签且带有滚动条的框架 一切工作正常 除了框架仅扩展到放置在其中的标签的大小 我希望框架扩展到父画布的大小 如果我对画布中的框架使用 pack expand True 我已在下面的
  • JMeter:java.net.NoRouteToHostException:无法分配请求的地址(地址不可用)

    我创建了一个带有 HelloController 的简单 Spring boot 应用程序 Get API http localhost 8080 hello Response Hello World 现在我创建了一个 JMeter 脚本
  • JavaScript 中 while(i--) 是什么意思?

    我正在使用 swipejsswipejs com 主页滑块使用此逻辑来突出显示活动的无序列表元素 我想知道这是如何实现的同时条件 works ul li li ul var bullets document getElementById b
  • 绑定许多数据框,添加带有其 id 的列[重复]

    这个问题在这里已经有答案了 我有许多重复命名的数据框 df 1 lt data frame x c 1 2 y 2 df 2 lt data frame x c 2 4 y 4 df 3 lt data frame x 2 y c 4 5
  • 哪里有复杂 ASP.net MVC 模型的示例? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找更复杂的 asp net 的示例mvc模型 我在 ASP net 站点上看到的所有模型都非常非常简单 并且只涉及一两个数据库表 我很好奇如
  • 对实体/资源进行 RESTful API 授权?

    我正在一个具有非常复杂的访问控制规则的系统中开发 API 通常需要复杂的 SQL 查询来确定用户是否具有对特定资源的读取或写入访问权限 这会导致我们的客户端应用程序变得非常复杂和冗余 因为它们必须了解所有这些规则才能确定是否向用户提供每个对
  • Flask中如何获取请求体字节?

    请求的content type is application json 但我想获取请求正文字节 Flask 会自动将数据转换为json 如何获取请求正文 您可以通过调用获取非表单相关的数据request get data 您可以通过访问来获
  • 单个图像文件用于存储页面上的所有小图像

    在最近的一场Stackoverflow 播客 Jeff 谈到拥有一个图像文件 其中包含遍布整个页面的所有小图像 然后使用 CSS 对其进行剪切 以便所有图像都能正确显示 重点是减少服务器请求的数量 以便页面加载速度更快 我当时想 哇 这真的
  • powershell脚本格式表输出中的颜色词

    是否可以使用格式表为 powershell 输出仅对某些单词 而不是完整的行 进行着色 例如 此脚本递归扫描文件夹中的字符串 然后使用格式表输出结果 dir r i Select String args 0 format table Pro
  • 从 xml 创建 python 对象表示的模块 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个易于处理的
  • 当用户向下滚动页面时加载图像 -

    我注意到博客中有一种趋势 即在向下滚动页面并且图像出现在视图屏幕中之前 图像不会加载 我想这一定是某种 jquery 魔法 但经过一番谷歌搜索后我无法弄清楚它是如何工作的 有谁知道这是如何做到的 编辑 如果您想查看此行为的示例 请查看 be
  • PHP:CURL已启用但没有效果

    I m trying to get data from external website using cURL in PHP but somehow it s not working I ve checked out that CURL e
  • 缺少“构建签名的 apk”选项

    将 Android Studio 更新到最新版本后 我找不到构建签名 apk 的选项 我已经尝试安装 Android Studio 的 beta 版和金丝雀版本 但它们似乎也不带有该选项 有人可以帮我弄清楚如何生成签名的apk吗 我尝试过重
  • 共享App应用程序快捷方式[UIApplicationShortcutIconTypeShare]

    我见过很多应用程序都使用UIApplicationShortcutIconTypeShare直接从主屏幕共享应用程序的应用程序快捷方式 它直接从主屏幕启动 UIActivityViewController 而无需打开应用程序 你是怎样做的
  • 每个 CPU 架构的真正 ELF TLS ABI 要求是什么?

    乌尔里希 德雷珀的论文on thread local storage 概述了几种不同 cpu 架构的 TLS ABI 但我发现它不足以作为实现 TLS 的基础 原因有两个 它省略了许多重要的体系结构 如 ARM MIPS 等 同时包括一堆完