dlopenmalloc死锁

dlopenmalloc死锁,c,malloc,deadlock,dlopen,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 /l

我们有一些经常死锁的单元测试。通过与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 ... #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 .... (gdb)英国电信 #内核vsyscall()中的0 0x00110424 #1 0x00c681a3位于/lib/libc.so.6中的uu lll_lock_wait_private()中 #2 0x00bf09fb位于/lib/libc.so.6中的_L_锁_515()中 #3/lib/libc.so.6中的tr_mallochook()中的0x00bf068c #来自/lib/libc.so.6的calloc()中的4 0x00bece22 #来自/lib/ld linux.so.2的新对象()中的5 0x00b5ed93 #6 0x00b5b287在/lib/ld linux.so.2的 #来自/lib/ld linux.so.2的7 0x00b5c521 in _dl_map_对象() #来自/lib/ld linux.so.2的dl_open_worker()中的8 0x00b66f43 #来自/lib/ld linux.so.2的9 0x00b629a6 in _dl_catch_错误() #来自/lib/ld linux.so.2的10 0x00b66a06 in _dl_open() #11/lib/libdl.so.2中dlopen_doit()中的0x00d38c3b #来自/lib/ld linux.so.2的12 0x00b629a6 in _dl_catch_错误() #13 0x00d3903c在/lib/libdl.so.2的_-dlerror_运行()中 #来自/lib/libdl.so.2的dlopen@GLIBC_2.1()中的14 0x00d38b71 ... 线程2:

(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 ... #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 .... #内核vsyscall()中的0 0x00110424 #1 0x00d4c059位于/lib/libpthread.so.0中的 #2 0x00d4740e位于/lib/libpthread.so.0的_L_lock_752()中 #3/lib/libpthread.so.0中pthread_mutex_lock()中的0x00d4731a #4 0x00c95dd2位于/lib/libc.so.6的_dl_addr()中 #5 0x00bf0425位于tru中,其中()来自/lib/libc.so.6 #6/lib/libc.so.6中的tr_mallochook()中的0x00bf06bd #来自/lib/libc.so.6的malloc()中的7 0x00bed01b .... 我在互联网上做了很多搜索,但我无法真正找出我是否做错了什么,或者我是否在库中发现了错误。

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

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

这个bug看起来和我提交的一个bug很相似