我怀疑这是由于使用__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变量的数量是有限的(因为它们不是动态分配的)?
正确。



