linux 有线程本地存储 (tls)?,有没有办法确定Linux上的库使用的线程本地存储模型...

这篇博客探讨了在链接共享对象时遇到的错误,涉及ELF文件中的DF_STATIC_TLS标志。作者解释了该标志意味着模块使用静态线程局部存储模型,并可能导致dlopen拒绝加载。通过readelf工具比较不同TLS模型(初始执行和全局动态)编译的库,展示了如何检查DF_STATIC_TLS标志。博客提供了检查受影响库的脚本,帮助解决相关问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我自己遇到了这个错误,在调查时,我来了一个

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.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创建脚本以查找受影响的库应该相当容易.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值