This is the mail archive of the cygwin-developers@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Loading a DLL after a fork is "fixed"


I've just posted a message to the cygwin mailing list indicating that
I've worked around the long-standing problem with loading DLLs in a
forked process.

Formerly, cygwin was able to load DLLs in a forked process only if the
DLLs were loaded into the DLL's specified base address.  That means if
two DLLs attempted to load to the same base address cygwin would blow up
on a fork.

I'm not exactly happy about the way that I had to fix this.  Here's
what I did:

1) Fork, starts a new process

2) "Forked" process does its usual magic, waits for DLL data segment to
    be filled in.  Then it determines if DLLs need to be loaded.

3) If DLLs need to be loaded, call
   LoadLibraryEx (name, NULL, DONT_RESOLVE_DLL_REFERENCES) for each
   name.  If the load address for the library == the parent's load address,
   everything is fine.  Load the library again and unload the previous handle.
   goto 5

4) If the address is different, mark as "reserved" all memory up to the parent DLL's
   load address.  Then attempt the load again.  The DLL should then load at the correct
   address.

5) Loop until no more DLLs

6) Go on about the fork().

As I said, this seems to work but gawd it's kludgy.

I couldn't find any better way to do this in any of my creative DejaNews or Altavista
searches.

If somebody has a better idea on how to do this, let me know.

-chris

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]