Subject: RE: dll_list::load_after_fork() blues (was Re: [ python-Bugs-489709 ] Building Fails ...)
From: "Norman Vine" <[email-masked]>
To: "'Robert Collins'" <[email-masked]>, "'Charles Wilson'" <[email-masked]>, "'Jason Tishler'" <[email-masked]>
Cc: "'Michael Hudson'" <[email-masked]>, <[email-masked]>, "'Cygwin'" <[email-masked]>
Date: Fri, 7 Dec 2001 20:32:07 -0500

Robert Collins writes:
>
>----- Original Message -----
>From: "Charles Wilson" <[email-masked]>
>> > The above occurs during Cygwin's fork() when the Cygwin DLL cannot
>> > load a DLL to the same address in the child that it had in the parent.
>> > I have seen this during Python 2.1.1 regression tests with threads
>> > enabled.
>>
>>
>> Part of the problem may be that cyggdbm.dll was built with
>> --auto-image-base.  It was later demonstrated that this can cause
>> problems with fork; you're better off just letting ld assign the default
>> dllbase, which means that EVERY process will remap the dll at runtime.
>> Thus, no hardcoded conflicts.  Downside: *very* slightly delay in
>> loading DLLs -- probably unnoticeable.
>>
>> (Did I get that right, robert?)
>
>Yes. There is actually a longer term solution... which is to 'rebase'
>every cygwin linked .dll on a particular system to not conflict with
>each other - which has to be done by setup.exe.

FWIW
I just tried patching Cygwin's dlopen() function to always rebase dll's
on loading with a 'slightly hacked to force rebasing' version of
niftyload.cpp
< available from http://thecodeproject/dll/niftyload.asp >
and got the same errors as Jason reported in his original message.

  C:\home\jtishler\src\PythonCvs\nothreads\python.exe: *** unable to remap
C:\cygwin\bin\cygssl.dll to same address as parent -- 0x1A2F0000
          0 [main] python 852 sync_with_child: child 2772(0x158) died before
initialization with status code 0x1
        996 [main] python 852 sync_with_child: *** child state child loading
dlls
    Traceback (most recent call last):
      File "test2.py", line 4, in ?
        pid = os.fork()
    OSError: [Errno 11] Resource temporarily unavailable

The author of the code states that the base address is chosen the wrong way.
"Rebased dll's should start from the top of address space and work down"

BTW
If it isn't obvious I know next to nothing about dll rebaseing issues

Cheers

Norman

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/