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

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

概述有没有办法在 Linux上查询共享库的TLS模型? (例如使用ldd或其他工具). 我在使用“initial-exec”模型加载太多库时遇到了麻烦,并且想确定哪个第三方库使用此模型(因此我可以释放一些插槽,例如通过静态链接). 这会导致错误: dlopen: cannot load any more object with static TLS 见this question. 我自己遇到了这个错误 有没有办法在 Linux上查询共享库的TLS模型? (例如使用ldd或其他工具).

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

这会导致错误:

dlopen: cannot load any more object with static TLS

见this question.

解决方法 我自己遇到了这个错误,在调查时,我来了一个 mailing list post with this info:

If you link a shared object containing IE-model access relocs,the object
will have the DF_STATIC_TLS flag set. By the spec,this means that dlopen
might refuse to load it.

查看/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 */

因此,您需要测试是否在共享库的DT_FLAGS条目中设置了DF_STATIC_TLS.

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

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

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

gcc -ftls-model=initial-exec -fPIC -c tls.c  -o tls-initial-exec.ogcc -shared tls-initial-exec.o -o tls-initial-exec.sogcc -ftls-model=global-dynamic -fPIC -c tls.c  -o tls-global-dynamic.ogcc -shared tls-global-dynamic.o -o tls-global-dynamic.so

当然,我可以看到使用readelf的两个库之间的区别:

$readelf --dynamic tls-initial-exec.soDynamic section at offset 0xe00 contains 25 entrIEs:  Tag        Type                         name/Value... 0x000000000000001e (FLAGS)              STATIC_TLS

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

总结

以上是内存溢出为你收集整理的有没有办法确定Linux上的库使用的线程本地存储模型全部内容,希望文章能够帮你解决有没有办法确定Linux上的库使用的线程本地存储模型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1049110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存