_dl_allocate_tls_init: Assertion `listp != NULL‘ failed!问题出现原因

文章讨论了在执行工程时遇到的_glibc错误_dl_allocate_tls_init:Assertion`listp!=NULLfailed!,该问题与dlopen和pthread_create函数在并发使用时的冲突有关。在glibc2.31的源码中,dlopen和pthread_create的特定操作可能导致线程安全问题。然而,这个问题已在glibc2.34中得到修复,因此在Ubuntu22.04上不会重现。相关讨论可在提供的Bugzilla链接中查看。

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

问题介绍

在执行工程的时候报错:_dl_allocate_tls_init: Assertion `listp != NULL’ failed!

问题原因

此问题的出现与dlopen、pthread_create相关。
在glibc2.31源码中,
dlopen()有下列代码段:
glibc——dlopen()相关代码

而在pthread_create()中进行了下列判断:
glibc——pthread_create()相关代码
令y = listp->slotinfo[cnt].gen, x = GL(dl_tls_generation).

可以看到,进行了如下操作:
T1:
y = x + 1;
++x;

T2:
assert(y <= x);

因此当两个线程并发调用dlopen()和pthread_create()时,就有可能报错。

此问题在glibc2.34中已经修复,因此在ubuntu22.04版本就不会出现。

对此问题的相关讨论在下方给出链接:
https://sourceware.org/bugzilla/show_bug.cgi?id=19329

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值