delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1997/03/18/19:15:58

From: j-cerney1 AT ti DOT com (John Cerney)
Subject: RE: Can't Reference Stderr from a DLL
18 Mar 1997 19:15:58 -0800 :
Approved: cygnus DOT gnu-win32 AT cygnus DOT com
Distribution: cygnus
Message-ID: <BMSMTP8586987008a0182636.cygnus.gnu-win32@dsbmail.itg.ti.com>
Reply-To: John Cerney <j-cerney1 AT ti DOT com>
Mime-Version: 1.0
X-Mailer: BeyondMail for Windows/Professional 2.3
Original-To: "gnu-win32 AT cygnus DOT com" <gnu-win32 AT cygnus DOT com>,
Sergey Okhapkin
<sos AT prospect DOT com DOT ru>
X-BeyondMail-Priority: 1
Conversation-ID: <01BC3394 DOT D4831CB0 AT gater DOT krystalbank DOT msk DOT ru>
In-Reply-To: <01BC3394.D4831CB0@gater.krystalbank.msk.ru>
X-Receipt-From-Agent: true
Original-Sender: owner-gnu-win32 AT cygnus DOT com

>
>  > main.c calls impure_setup() in the dll with main's impure_ptr as its 
>  argument
>  >        impure_setup() in init.cc takes the impure_ptr from main and 
>  copies the
>  >        value to its (the dll's) local copy of impure_ptr.
>  
>  It's not a suitable way for me :-( It requires explicit call to 
>  impure_setup() for _each_ project's dll! This will prevent easy porting (X 
>  stuff for example). If reent_data will be exported from within cygwin.dll, 
>  then it will be possible to write
> 

For my work of porting perl5.003_25 to cygwin32, this was not really a problem.
Perl uses dynamic libraries to load language extension modules. These modules
are built as DLLs and are loaded at run-time (for win32, using the
LoadLibraryEx and GetProcAddress calls) by one piece of code (dynaloader.c).
Dynaloader.c in perl is already different for each OS the language is ported
to, so it was not hard for me to add the call to impure_setup() in dynaloader.c
just after it loads the dll module.
 
>  #include <windows.h>
>  extern struct reent *_impure_ptr, *__imp_reent_data;
>  int WINAPI dll_main(HANDLE a, DWORD reason, void *q)
>  { switch (reason){
>     case DLL_PROCESS_ATTACH: break;
>     case DLL_PROCESS_DETACH: break;
>     case DLL_THREAD_ATTACH:  break;
>     case DLL_THREAD_DETACH:  break;
>    }
>    _impure_ptr = __imp_reent_data;
>    return 1;
>  }
>  
>  and link this file to every DLL. Function dll_main (declared as entry point 
>  on ld's command line) will be called automatically after loading dll, and 
>  will set up dll's _impure_ptr right without explicit call to it! Number of 
>  dll's may vary - initialisation for each dll will be done automatically.
>  

This looks like a good, clean approach, hopefully cygnus will implement
something like this.

-
For help on using this list, send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019