本站教程收集整理的这篇文章主要介绍了有没有办法确定Linux上的库使用的线程本地存储模型,本站教程本站觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法在
Linux上查询共享库的TLS模型? (例如使用ldd或其他工具).
我在使用“initial-exec”模型加载太多库时遇到了麻烦,并且想确定哪个第三方库使用此模型(因此我可以释放一些插槽,例如通过静态链接).
这会导致错误:
dlopen: cAnnot load any more object with static TLS
见this question.
解决方法
我自己遇到了这个错误,在调查时,我来了一个
mailing list post with this info:
查看/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.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 vps云服务器 -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
tls-global-dynamic.so版本没有DT_FLAGS条目,大概是因为它没有设置任何标志.因此,使用readelf和grep创建脚本以查找受影响的库应该相当容易.
本站总结
以上是本站教程为你收集整理的有没有办法确定Linux上的库使用的线程本地存储模型全部内容,希望文章能够帮你解决有没有办法确定Linux上的库使用的线程本地存储模型所遇到的程序开发问题。
如果觉得本站教程网站内容还不错,欢迎将本站教程推荐给好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。