栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

无法再使用静态TLS加载任何对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

无法再使用静态TLS加载任何对象

我怀疑这是由于使用__thread变量引起的。

正确。

但是,此类变量不会在加载的模块中使用-只会在加载器模块本身中使用。

不正确 您可能没有使用

__thread
自己,但是您静态链接到模块中的某些库 正在 使用它们。您可以通过以下方式进行确认:

readelf -l /path/to/foo.so | grep TLS

可能是什么原因?

该模块正在使用

-ftls-model=initial-exec
,但应该正在使用
-ftls-model=global-dynamic
。这种情况最常发生在链接到的(某些)代码
foo.so
没有构建时
-fPIC

将非

-fPIC
代码链接到共享库在上是不可能的
x86_64
,但在上是允许的
ix86
(这会导致许多细微的问题,例如此问题)。

更新:

我有1个模块在没有-fPIC的情况下编译,但是据我所知,默认值不是initial-exec,所以我根本没有设置tls-model

  • 每个ELF映像(可执行或共享库)只能有一个tls模型。
  • TLS模型默认
    initial-exec
    为非
    -fPIC
    代码。

因此,如果您链接甚至一个非

-fPIC
对象使用
__thread
foo.so
,然后
foo.so
得到
initial-exec
所有
的TLS的。

那么,为什么会引起问题-因为如果使用initial-exec,则tls变量的数量是有限的(因为它们不是动态分配的)?

正确。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号