有没有办法确定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 -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 Mint中编译C程序时出错
- 使用quadmath的G 4.6.3 Linux中的四倍精度
- 如何在Linux上从PHP创建与WinZip兼容的AES-256加密zip文件?
- LINUX学习:RHEL 6.6下安装Ansible
- linux – Linked无法找到符号,但读取库并存在符号
- 存储 – Linux – 实际硬件RAID控制器调优(scsi和cciss)
- linux – Shell返回“PuTTYPuTTYPuTTY …”
- 为什么/usr/include/linux/stddef.h为空?
- linux – Eclipse不会启动,因为`reload maven项目遇到了一个
- linux – 静态连接图书馆的专业和缺点是什么?