Another problem with DLL's

Sergey Okhapkin sos@prospect.com.ru
Sat Mar 22 00:39:00 GMT 1997


John Cerney wrote:
>
> When running, the thing crashes when the DLL function is called. An 
access
> violation occurs in cygwin.dll. The foo.dll that is built uses cygwin.dll 
for
> its printf function. If I take the printf out of the foo.dll code the 
VC++
> main2.exe will run just fine.
>

This problem is due to struct reent_data in a dll and pointer to it 
(_impure_ptr) remains uninitialized after dll loading. The patch below 
solves this problem. This patch moves reent_data from application's private 
address space to cygwin.dll and adds pointer to this structure to 
cygwin.dll export table. Auto-initialisation code of your dll now can 
initialize _impure_ptr properly. Also, this patch modifies fork() code to 
copy contents of parent's reent_data to the child. Allpy this patch (it 
modifies files dcrt0.cc, fork.cc and winsup.h), add "reent_data" to export 
list in cygwin.din, and rebuild cygwin.dll. Add the following file to your 
dll:

#include <windows.h>
#include <stdio.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;
}
main(){}

and build your dll (I've used three-pass method as for cygwin.dll). Ld's 
command line should contain "-e _dll_main@12".

 

--
Sergey Okhapkin
Moscow, Russia
Looking for a job

begin 600 dll.diff
M*BHJ(&1C<G0P+F-C"51U92!&96(@,#0@,#<Z,#<Z,#,@,3DY-PHM+2T@93ID
M8W)T,"YC8PE4:'4@36%R(#(P(#(R.C$U.C0R(#$Y.3<**BHJ*BHJ*BHJ*BHJ
M*BHJ"BHJ*B S,BPS-R J*BHJ"BTM+2 S,BPS." M+2TM"B @("!C:&%R("HJ
M96YV:7)O;CL*(" @("\J(%]?<')O9VYA;64@=7-E9"!I;B!G971O<'0@97)R
M;W(@;65S<V%G92 J+PH@(" @8VAA<B J7U]P<F]G;F%M93L**R @('-T<G5C
M="!?<F5E;G0@<F5E;G1?9&%T83L*("!].PH@( H@('-T871I8R!C;VYS="!I
M;G0@8WEG=VEN7V1L;%]V97)S:6]N7VUA:F]R(#T@0UE'5TE.7T1,3%]615)3
M24].7TU!2D]2.PHJ*BHJ*BHJ*BHJ*BHJ*BH**BHJ(#(V-"PR-S @*BHJ*@H@
M(" @:6YT(&%R9V,["B @("!C:&%R("HJ87)G=CL*(" @(&EN="!I.PHM(" @
M<W1R=6-T(%]R965N="!R965N=%]D871A.PH@(" @+RH@06-C;W)D:6YG('1O
M(&]N;F] <W1A8VLN=7)C+G1U92YN;"P@=&AE(&5X8V5P=&EO;B!H86YD;&5R
M(')E8V]R9"!M=7-T"B @(" @("!B92!O;B!T:&4@<W1A8VLN(" J+PH@(" @
M+RH@1DE8344Z(%9E<FEF>2!F;W)K960@8VAI;&1R96X@9V5T('1H96ER(&5X
M8V5P=&EO;B!H86YD;&5R('-E="!U<"!O:RX@("HO"BTM+2 R-C4L,C<P("TM
M+2T**BHJ(&9O<FLN8V,)5'5E($9E8B Q,2 P,#HQ,#HQ.2 Q.3DW"BTM+2!E
M.F9O<FLN8V,)5&AU($UA<B R," Q-SHQ-#HT.2 Q.3DW"BHJ*BHJ*BHJ*BHJ
M*BHJ*@HJ*BH@,C L,C4@*BHJ*@HM+2T@,C L,C<@+2TM+0H@("-I;F-L=61E
M(#QU;FES=&0N:#X*(" C:6YC;'5D92 B=VEN<W5P+F@B"B @"BL@97AT97)N
M(")#(B!S=')U8W0@7W)E96YT(')E96YT7V1A=&$["BL@"B @+RH@5&EM96]U
M="!T;R!W86ET(&9O<B!C:&EL9"!T;R!S=&%R="P@<&%R96YT('1O(&EN:70@
M8VAI;&0L(&5T8RX@("HO"B @+RH@1DE8344Z($]N8V4@=&AI;F=S('-T86)I
M;&EZ92P@8G5M<"!U<"!T;R!A(&9E=R!M:6YU=&5S+B @*B\*(" C9&5F:6YE
M($9/4DM?5T%)5%]424U%3U54("@Q,C @*B Q,# P("\J(#$R,"!S96-O;F1S
M("HO*0HJ*BHJ*BHJ*BHJ*BHJ*BH**BHJ(#$Y,2PQ.3<@*BHJ*@H@( H@(" @
M+RH@26YI=&EA;&EZ92!T:&EN9W,@=&AA="!A<F4@9&]N92!L871E<B!I;B!D
M;&Q?8W)T,%\Q('1H870@87)E;B=T(&1O;F4*(" @(" @(&9O<B!T:&4@9F]R
M:V5E+B @*B\*(2 @("\J("!C:&EL9"T^<F5E;G1?9&%T82 ]("!U+3YS96QF
M+3YR965N=%]D871A.RHO"B @("!C:&EL9"T^<')O9VYA;64@/2!U+3YS96QF
M+3YP<F]G;F%M93L*(" *(" @("\J($-O<'D@86QL('1H92!H86YD;&5S('=E
M(&YE960@:6X@=&AE(&-H:6QD+B @*B\*+2TM(#$Y,RPQ.3D@+2TM+0H@( H@
M(" @+RH@26YI=&EA;&EZ92!T:&EN9W,@=&AA="!A<F4@9&]N92!L871E<B!I
M;B!D;&Q?8W)T,%\Q('1H870@87)E;B=T(&1O;F4*(" @(" @(&9O<B!T:&4@
M9F]R:V5E+B @*B\*(2 @(&-H:6QD+3YR965N=%]S879E(#T@(')E96YT7V1A
M=&$["B @("!C:&EL9"T^<')O9VYA;64@/2!U+3YS96QF+3YP<F]G;F%M93L*
M(" *(" @("\J($-O<'D@86QL('1H92!H86YD;&5S('=E(&YE960@:6X@=&AE
M(&-H:6QD+B @*B\**BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B S.3$L,SDV("HJ*BH*
M+2TM(#,Y,RPS.3D@+2TM+0H@(" @(" @(&1E8G5G7W!R:6YT9B H(F9O<FM?
M:&5L<&5R.B!C:&EL9"!I<R!R=6YN:6YG7&XB*3L*(" *(" @(" @("!U+3YS
M96QF(#T@<RT^<%MX73L**R @(" @("!R965N=%]D871A(#T@=2T^<V5L9BT^
M<F5E;G1?<V%V93L*(" @(" @("!D96)U9U]P<FEN=&8@*")F;W)K(&-H:6QD
M.B!S96QF("5P+"!P:60@)60L('!P:60@)61<;B(L"B @"0D@(" @=2T^<V5L
M9BP@>"P@=2T^<V5L9BT^<'!I9"D["B @"BHJ*B!W:6YS=7 N:"YO<FEG"49R
M:2!&96(@,30@,#$Z,#$Z,3D@,3DY-PHM+2T@=VEN<W5P+F@)5&AU($UA<B R
M," Q-SHP,SHR-R Q.3DW"BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@,C,X+#(T,R J
M*BHJ"BTM+2 R,S@L,C0T("TM+2T*(" *(" @("\J($]P96X@9FEL92!T86)L
M92X@*B\*(" @(&AI;F9O7W9E8R!H;6%P.PHK(" @<W1R=6-T(%]R965N="!R
M965N=%]S879E.PH@( H@(" @<W1R=6-T('-I9V%C=&EO;B!S:6=S6TY324==
M.PH@(" @<VEG<V5T7W0@<VEG7VUA<VL["0DO*B!O;F4@<V5T(&9O<B!E=F5R
5>71H:6YG('1O(&EG;F]R92X@*B\*
`
end

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



More information about the Cygwin mailing list