有没有办法确定 Linux 上的库使用的线程本地存储模型

2023-12-29

有没有办法在Linux上查询共享库的TLS模型? (例如使用 ldd 或其他一些工具)。

我在使用“initial-exec”模型加载太多库时遇到麻烦,并且想确定哪些第三方库使用此模型(这样我可以通过静态链接来释放一些插槽)。

这会导致错误:

 dlopen: cannot load any more object with static TLS

see 这个问题 https://stackoverflow.com/questions/19268293/matlab-error-cannot-open-with-static-tls.


我自己也遇到了这个错误,在调查它的过程中,我发现了一个包含此信息的邮件列表帖子 http://www.redhat.com/archives/phil-list/2003-February/msg00077.html:

如果链接包含 IE 模型访问重定位的共享对象,则该对象 将设置 DF_STATIC_TLS 标志。根据规范,这意味着 dlopen 可能会拒绝加载它。

看着/usr/include/elf.h, 我们有:

/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
...
#define DF_STATIC_TLS   0x00000010      /* Module uses the static TLS model */

所以你需要测试是否DF_STATIC_TLS被设置在DT_FLAGS共享库的入口。

为了测试,我使用线程本地存储创建了一段简单的代码:

static __thread int foo;
void set_foo(int new) {
    foo = new;
}

然后我使用两个不同的线程本地存储模型对其进行了两次编译:

gcc -ftls-model=initial-exec -fPIC -c tls.c  -o tls-initial-exec.o
gcc -shared tls-initial-exec.o -o tls-initial-exec.so

gcc -ftls-model=global-dynamic -fPIC -c tls.c  -o tls-global-dynamic.o
gcc -shared tls-global-dynamic.o -o tls-global-dynamic.so

果然,我可以使用以下命令看到两个库之间的区别readelf:

$ readelf --dynamic tls-initial-exec.so

Dynamic section at offset 0xe00 contains 25 entries:
  Tag        Type                         Name/Value
...
 0x000000000000001e (FLAGS)              STATIC_TLS

The tls-global-dynamic.so版本没有DT_FLAGS条目,大概是因为它没有设置任何标志。所以使用创建脚本应该相当容易readelf and grep查找受影响的库。

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

有没有办法确定 Linux 上的库使用的线程本地存储模型 的相关文章

随机推荐

  • Haskell 中的惰性笛卡尔积

    我想在 Haskell 中生成一个相当大但有限的笛卡尔积 然后我需要对其进行迭代 想想平均场模型的配分函数 自然而然的事情使用sequence 像这样 l sequence replicate n 0 1 2 不幸的是 对于大n 这不适合内
  • 如何创建 android:pathData?

    所以我需要在我的应用程序中使用路径数据 有没有办法将已有的图像转换为路径数据 或者唯一的方法是使用 Photoshop 等实际计算所有像素 矢量图像android中的PathData是矢量图形程序的脚本 它并不是完全干净且人类可读的代码作为
  • 无法创建 yeoman web 应用程序

    当我尝试创建一个网络应用程序时 我得到了这个yeoman usr local lib node modules yo node modules insight node modules configstore configstore js
  • 为什么这段C代码可以编译?

    include
  • 在 Logback 中创建自定义布局

    我正在尝试在 logback 中创建自定义布局 如示例中所示手册第 6 章 http logback qos ch xref chapters layouts MySampleLayout html package com dces uti
  • 在 Rails 4 中创建到外部 URL 的 Rails 路由

    我有一堆路由 50 需要映射到外部 URL 我绝对可以按照建议做here https stackoverflow com questions 3622706 creating a rails route to an external url
  • Fortran 77 注释的语法突出显示在 vim 中不起作用

    我有一段用 Fortran 77 编写的代码 我用 vim 读取它 编写代码时 注释位于以c 这是 Fortran 77 中的标准 但是 vim 无法识别它们 因此使用着色语法 这使得代码非常难以阅读 我怎样才能克服这个问题 我看到有一个发
  • 在java中查找字符串中字符频率的有效方法:O(n)

    在最近的一次采访中 我被要求编写以下程序 找出给定字符串中频率最小的字符 因此 我尝试使用 charAt 迭代字符串 并将字符存储为 HashMap 中的键 并将出现次数作为其值 现在我必须再次迭代 Map 才能找到最低的元素 有没有一种更
  • 如何创建具有基本身份验证的 ASP.NET 网页

    我想创建 ASP NET 网页 该网页将提示我弹出基本身份验证窗口 我将在其中输入凭据 我尝试在 PreInit 和 PreLoad 事件处理程序中添加以下代码行 但它仍然没有显示基本身份验证弹出窗口 protected override
  • SQLNonTransientConnectionException 在 Eclipse 中连接 MySQL

    我正在尝试编写代码 使用 Eclipse MySQL Workbench 和 JDBC 8 0 11 将文本文件的数据导入数据库 它给了我一个 ClassNotFoundException 我已经查看了多个其他问题 并且通过将 java c
  • MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃

    我使用 AutoFac 设置了一个包含 2 个消费者的 Windows 服务 在一条快乐的道路上 这确实非常有效 我的印象是大众交通为我处理了例外情况 正如文档所述 http docs masstransit project com en
  • 使用报表查看器在运行时将未知数量的图像插入到报表中

    我正在使用reportviewer 我想在运行时向报告中添加未知数量的图像 用户应该选择一些图像 在另一个地方 这些图像应该一个接一个地显示在报告中 您知道如何使用报表查看器来做到这一点吗 谢谢 奥菲尔 有很多方法可以做到这一点 这是一种可
  • 头文件在代码块中工作吗?

    延迟函数为dos h头文件在代码块中不起作用 它表明延迟函数未声明 以下链接包含以下程序 link http www programmingsimplified com c dos h delay int main printf This
  • 寻找有界子图之间的最小割集

    如果游戏地图被划分为子图 如何最小化子图之间的边 我有一个问题 我试图通过基于网格的游戏 如 pacman 或 sokoban 进行 A 搜索 但我需要找到 外壳 外壳是什么意思 子图尽可能少切边 http en wikipedia org
  • 查找嵌入式 Linux 系统中的延迟问题(停顿)

    我有一个在 Atmel AT91SAM9260EK 板上运行的嵌入式 Linux 系统 其中有两个进程以实时优先级运行 管理器进程使用 POSIX 消息队列定期 ping 工作进程 以检查工作进程的运行状况 通常 往返 ping 需要大约
  • 可以使用 Java 程序的退出代码来检测磁盘空间不足的异常吗?

    我的 Java 程序是从 Windows 脚本调用的 是否可以使用 Java 退出代码来确定 Java 程序是否因磁盘空间不足而提前终止 同时它仍在从 JAR 文件加载类文件 我尝试了内存不足异常 它返回退出代码 1 但磁盘空间不足返回退出
  • 如何使 C++ 指针为空 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在声明所有 C 指针时 所有指针都应
  • Azure 流分析将行旋转为列

    我有一个类似的数据 deviceid d1 parameter p1 value 1 timestamp 2018 03 22T12 33 00 deviceid d1 parameter p2 value 2 timestamp 2018
  • 如何使用在其他地方创建的预聚类数据在 R 中创建树状图?

    我有用 Java 编写的集群代码 我可以从中创建嵌套树结构 例如下面显示了树的一小部分 其中两个 isRetired 对象在第一次迭代中聚集在一起 并且该组在第五次迭代中与 setIsRequired 聚集在一起 簇中对象之间的距离显示在括
  • 有没有办法确定 Linux 上的库使用的线程本地存储模型

    有没有办法在Linux上查询共享库的TLS模型 例如使用 ldd 或其他一些工具 我在使用 initial exec 模型加载太多库时遇到麻烦 并且想确定哪些第三方库使用此模型 这样我可以通过静态链接来释放一些插槽 这会导致错误 dlope