Segmentation fault after new wine update and install

Vincent Béron vberon at mecano.gme.usherb.ca
Wed Sep 10 13:11:41 CDT 2003


Le mer 10/09/2003 à 11:51, Shachar Shemesh a écrit :
> That's exactly the problem I'm having with compiling Wine without 
> optimizations. the wine binary tries to link with ntdll. ntdll needs 
> "InterlockedCompareExchange" from kernel32. In my case, this translates 
> to a compilation error, which I have not managed to eliminate.

I'm leaning towards the inline InterlockedCompareExchange from
winbase.h, as if I rebuild ntdll with -O1 miscemu/wine is built
correctly (ie ntdll doesn't have any undefined references). It's from
win32/device.c and win32/except.c which call
InterlockedCompareExchangePointer(), which itself calls
InterlockedCompareExchange() from winbase.h.

"extern inline InterlockedCompareExchange() {return bar();}" seems a bit
odd for a function definition. What the purpose of having both extern
and inline?

The whole point might be moot regarding linking, as ntdll is not
required for miscemu/wine (see below).

> 
> Ok, the tie breaker is in.
> On Windows 2000, ntdll.dll is not depnding on ANYTHING else. On the 
> other hand, kernel32.dll does depend on ntdll.dll. This means that we 
> have a circular dependancy in Wine that is not there in Windows 2000.
> 
> >Would it be acceptable to swap the following 2 lines in wine_init (sorry
> >about the wrapping):
> >if (!(ntdll = dlopen_dll( "ntdll.dll", error, error_size, 0,
> >&file_exists ))) return;
> >if (!dlopen_dll( "kernel32.dll", error, error_size, 0, &file_exists ))
> >return;
> >  
> >
> I think it would be wrong. Kernel32 obviously does depend on ntdll. It 
> would probably be better to figure out why ntdll depends on kernel32 (we 
> know that - InterlockedCompareExchange), and remove that.

See above. BTW, ldd ntdll.dll.so doesn't show kernel32.

> 
> >so kernel32.dll is opened before ntdll.dll, or is there a dependency
> >from kernel32.dll to ntdll.dll?
> >  
> >
> Unfortunetly, there is in Wine too.

Yes, ntdll is the first thing to be loaded.

> 
> >Or is it possible to move the pthread_init function elsewhere, to
> >someplace called before ntdll.dll is loaded?
> >  
> >
> Do "ldd miscemu/wine" for an answer - ntdll is loaded by the Linux 
> linker, even if dlopen was not called at all. It's an interesting 
> question why we need the dlopen, then.

Hmmm... I guess the -lntdll.dll on the linking line of miscemu/wine is
the cause :)
I've been able to link it while removing that part, so I'm not sure if
that part is still useful.

Vincent





More information about the wine-devel mailing list