c - dlopen malloc 死锁

标签 c malloc deadlock dlopen

我们有一些经常死锁的单元测试。使用 GDB 进行更仔细的检查会发现以下内容:

线程 1:

(gdb) bt
#0  0x00110424 in __kernel_vsyscall ()
#1  0x00c681a3 in __lll_lock_wait_private () from /lib/libc.so.6
#2  0x00bf09fb in _L_lock_515 () from /lib/libc.so.6
#3  0x00bf068c in tr_mallochook () from /lib/libc.so.6
#4  0x00bece22 in calloc () from /lib/libc.so.6
#5  0x00b5ed93 in _dl_new_object () from /lib/ld-linux.so.2
#6  0x00b5b287 in _dl_map_object_from_fd () from /lib/ld-linux.so.2
#7  0x00b5c521 in _dl_map_object () from /lib/ld-linux.so.2
#8  0x00b66f43 in dl_open_worker () from /lib/ld-linux.so.2
#9  0x00b629a6 in _dl_catch_error () from /lib/ld-linux.so.2
#10 0x00b66a06 in _dl_open () from /lib/ld-linux.so.2
#11 0x00d38c3b in dlopen_doit () from /lib/libdl.so.2
#12 0x00b629a6 in _dl_catch_error () from /lib/ld-linux.so.2
#13 0x00d3903c in _dlerror_run () from /lib/libdl.so.2
#14 0x00d38b71 in dlopen@@GLIBC_2.1 () from /lib/libdl.so.2
...

线程 2:

#0  0x00110424 in __kernel_vsyscall ()
#1  0x00d4c059 in __lll_lock_wait () from /lib/libpthread.so.0
#2  0x00d4740e in _L_lock_752 () from /lib/libpthread.so.0
#3  0x00d4731a in pthread_mutex_lock () from /lib/libpthread.so.0
#4  0x00c95dd2 in _dl_addr () from /lib/libc.so.6
#5  0x00bf0425 in tr_where () from /lib/libc.so.6
#6  0x00bf06bd in tr_mallochook () from /lib/libc.so.6
#7  0x00bed01b in malloc () from /lib/libc.so.6
....

我在 Internet 上进行了很多搜索,但我无法确定是我做错了什么,还是我在库中发现了错误。

最佳答案

glibc 的 dlopen() 代码似乎不是线程安全的。

看起来您的代码从两个线程同时调用了 malloc()dlopen()。它也看起来像 malloc() 调用遇到了一个未解析的动态符号并尝试使用 _dl_addr() 来解析它,这意味着您正在执行的二进制文件是通过延迟绑定(bind)链接的(默认 ld 行为)这就是运行时链接器在第一次调用时按需解析符号的原因。尝试将其与 -Wl,-z,now gcc 链接器选项链接,使运行时链接器在启动您的应用程序之前解析所有符号。

这个错误看起来与我提交的错误相似 bug report反对。

关于c - dlopen malloc 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954527/

相关文章:

c - 指针和 printf()

c - 如何使用 perror 打印变量

c - 无需在 C 中使用 goto 即可优雅地退出函数的优雅方式

C - malloc 分配过多内存

linux - 为什么这个 C++11 程序不会死锁?

java - 为什么不建议从 finally 子句中调用二进制信号量的 release() 方法?

c - pthread_mutex_trylock 段错误

c - 如何使用 fwrite() 多次写入默认结构值

c - 动态增长数组直到键输入错误 : invalid next size

c - 如何对使用 malloc 声明的 int 数组进行操作?