Uwe Bonnes wrote:
> Marcus Meissner writes:
>
>> Nice repeating frames. I think dlopen() is not considered to be reentrant
>> or is not able to do locking.
>>
>> Do you get any pthread_lock warnings messages?
>>
>> And do 'x /s 0x5f49cd08' and 'x /s 0x405a5608' in the debugger to see what
>> it tried to load ;)
>>
>> Ciao, Marcus
>
>
> I get
>
> fixme:pthread_kill_other_threads_np
>
> Both libraries involved are
>
> winspool.drv and comdlg32.dll
I'm having nearly the same problem. Running glibc2.1.2 on
an SMP machine. Adding a printf
before the dlopen() call in dlopen_dll() and running with
LD_BIND_NOW=1 and LD_DEBUG=files,libs,reloc,versions
produces:
dlopen_dll: 'libshell32.so'
20764:
find library=libshell32.so; searching
20764:
search path=/home/abbeyj/wine:/home/abbeyj/wine/dlls (LD_LIBRARY_PATH)
20764:
trying file=/home/abbeyj/wine/libshell32.so
20764:
trying file=/home/abbeyj/wine/dlls/libshell32.so
20764:
20764:
file=libshell32.so; generating link map
20764:
dynamic: 0x4084403c base: 0x407e8000 size: 0x0005c260
20764:
entry: 0x407fe000 phdr: 0x407e8034 phnum: 3
20764:
20764:
checking for version `GLIBC_2.1' in file /lib/libc.so.6 required by file
/home/abbeyj/wine/dlls/libshell32.so
20764:
checking for version `GLIBC_2.0' in file /lib/libc.so.6 required by file
/home/abbeyj/wine/dlls/libshell32.so
20764:
20764:
relocation processing: /home/abbeyj/wine/dlls/libshell32.so
20764:
20764:
calling init: /home/abbeyj/wine/dlls/libshell32.so
20764:
dlopen_dll: 'libole32.so'
fixme:pthread_kill_other_threads_np
20767:
20767:
file=libuser32.so; needed by h:\wine\debugger\winedbg
So, we try to dlopen libshell32.so and dlopen() calls the init
routine for that library. In the init routine, Wine tries to
load all the libraries that this one depends on. So, in this
case, it tries to dlopen libole32.so. It crashes
and launches the debugger (notice the pid in the left column
changes). I've also seen the problem with libversion.so loading
liblz32.so. In that case the stack backtrace is slightly
different (crashes in a different place), but I don't think
its too important.
So, is dlopen() supposed to be reentrant? If not, we have a
problem.
--
James Abbatiello