digitalmars.D.learn - Can't figure out segfault
- rm (255/255) Mar 01 2011 I put together bindings for DevIL in D to use on a school assignment. T...
- Daniel Murphy (36/36) Mar 02 2011 Assuming you've checked that dlopen isn't returning null, I can't find t...
- Mike Wey (9/26) Mar 02 2011 On linux the linker is called with --export-dynamic by default and this
I put together bindings for DevIL in D to use on a school assignment. The bindings (attached) work fine on Windows, but cause a segfault on Linux when I call ilInit. this can be demonstrated by a little test program " import graphics.bindings.devil; public void main(string[] args) { ilInit(); } " compiled with "dmd -L-ldl test.d devil.d" where test.d is the above program and devil.d is attached. When run, this program segfaults, but if lines 112,113,165,166 of devil.d are commented out, the program works fine, and I can't figure out what the problem with those lines is. The fact that this works on Windows confuses me even more. Any help would be appreciated. begin 644 devil.d M;6]D=6QE(&=R87!H:6-S+F)I;F1I;F=S+F1E=FEL.PH*:6UP;W)T('-T9"YS M=')I;F<[" IV97)S:6]N*%=I;F1O=W,I"GL*"6EM<&]R="!S=&0N8RYW:6YD M;W=S+G=I;F1O=W,["GT*96QS92!V97)S:6]N*&QI;G5X*0I[" EI;7!O<G0 M<W1D+F,N;&EN=7 N;&EN=7 ["GT*96QS90I[" ES=&%T:6, 87-S97)T*&9A M;'-E*3L*?0H*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7T-/3$]54E])3D1% M4E])3D1%6"` ("` (#T ,' Q.3`P.PIP=6)L:6, :6UM=71A8FQE('5I;G0 M24Q?04Q02$$)"0D (#T ,' Q.3`V.PIP=6)L:6, :6UM=71A8FQE('5I;G0 M;6UU=&%B;&4 =6EN="!)3%]"1U( ("` ("` ("` ("` (#T ,' X,$4P.PIP M0T5?04Q02$$ (#T ,' Q.3!!.PH*<'5B;&EC(&EM;75T86)L92!U:6YT($E, M7T)95$4 ("` ("` ("` (#T M;75T86)L92!U:6YT($E,7U5.4TE'3D5$7U-(3U)4(#T M,30P-3L*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7T9,3T%4("` ("` ("` M(#T M(3P 36EC<F]S;V9T(%=I;F1O=W, 0FET;6%P("T +F)M<"!E>'1E;G-I;VX* M,3L ("\O(3P 1'(N($AA;&\ +2`N8W5T(&5X=&5N<VEO; IP=6)L:6, :6UM M=71A8FQE('5I;G0 24Q?1$]/32` ("` ("` (#T M;V]-('=A;&QS("T ;F\ <W!E8VEF:6, 97AT96YS:6]N"G!U8FQI8R!I;6UU M;TT 9FQA=', +2!N;R!S<&5C:69I8R!E>'1E;G-I;VX*<'5B;&EC(&EM;75T M<F]S;V9T(%=I;F1O=W, 26-O;G, 86YD($-U<G-O<G, +2`N:6-O(&%N9"`N M8W5R(&5X=&5N<VEO;G,*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7TI01R` M("YJ<&5G(&5X=&5N<VEO;G,*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7TI& M("A&3U)-($E,0DTI("T +FEF9BP +FEL8FTL("YL8FT 97AT96YS:6]N<PIP M=6)L:6, :6UM=71A8FQE('5I;G0 24Q?4$-$("` ("` ("` (#T M.R` +R\A/"!+;V1A:R!0:&]T;T-$("T +G!C9"!E>'1E;G-I;VX*<'5B;&EC M(3P 6E-O9G0 4$-8("T +G!C>"!E>'1E;G-I;VX*<'5B;&EC(&EM;75T86)L M+G!I8R!E>'1E;G-I;VX*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7U!.1R` M:&EC<R`M("YP;F< 97AT96YS:6]N"G!U8FQI8R!I;6UU=&%B;&4 =6EN="!) M87` +2`N<&)M+"`N<&=M+"`N<'!M(&%N9"`N<&YM(&5X=&5N<VEO;G,*<'5B M("\O(3P 4VEL:6-O;B!'<F%P:&EC<R`M("YS9VDL("YB=RP +G)G8B!A;F0 M+G)G8F$ 97AT96YS:6]N<PIP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?5$=! M("` ("` ("` (#T M;&4 +2`N=&=A+"`N=F1A+"`N:6-B(&%N9"`N=G-T(&5X=&5N<VEO;G,*<'5B M("\O(3P 5&%G9V5D($EM86=E($9I;&4 1F]R;6%T("T +G1I9B!A;F0 +G1I M9F8 97AT96YS:6]N<PIP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?0TA%040 M("` ("` (#T M=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?4D%7("` ("` ("` M(#T M=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?5T%,("` ("` ("` M(#T M<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?3$E&("` ("` ("` (#T M:6]N"G!U8FQI8R!I;6UU=&%B;&4 =6EN="!)3%]-3D< ("` ("` ("` /2`P M+2`N;6YG(&5X=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?2DY' M("` ("` ("` (#T M26YT97)C:&%N9V4 1F]R;6%T("T +F=I9B!E>'1E;G-I;VX*<'5B;&EC(&EM M1&ER96-T1')A=R!3=7)F86-E("T +F1D<R!E>'1E;G-I;VX*<'5B;&EC(&EM M6E-O9G0 375L=&DM4$-8("T +F1C>"!E>'1E;G-I;VX*<'5B;&EC(&EM;75T M8F4 4&AO=&]3:&]P("T +G!S9"!E>'1E;G-I;VX*<'5B;&EC(&EM;75T86)L M+R$\(%!A:6YT4VAO<"!0<F\ +2`N<'-P(&5X=&5N<VEO; IP=6)L:6, :6UM M=71A8FQE('5I;G0 24Q?4$E8("` ("` ("` (#T M25 +2`N<&EX(&5X=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q? M4%A2("` ("` ("` (#T M96YS:6]N"G!U8FQI8R!I;6UU=&%B;&4 =6EN="!)3%]84$T ("` ("` ("` M1CL ("\O(3P 4F%D:6%N8V4 2&EG:"!$>6YA;6EC(%)A;F=E("T +FAD<B!E M(&5X=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?5T10"0D)/2`P M9'` 97AT96YS:6]N"G!U8FQI8R!I;6UU=&%B;&4 =6EN="!)3%]65$8)"0D] M=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?5T)-4`D)"3T ,' P M/"!3=6X 4F%S=&5R("T +G-U;BP +G)A<RP +G)S+"`N:6TQ+"`N:6TX+"`N M:6TR-"!A;F0 +FEM,S( 97AT96YS:6]N<PIP=6)L:6, :6UM=71A8FQE('5I M1F]R;6%T("T +FEF9B!E>'1E;G-I;VX*<'5B;&EC(&EM;75T86)L92!U:6YT M+G1P;"!E>'1E;G-I;VX*<'5B;&EC(&EM;75T86)L92!U:6YT($E,7T9)5%,) M<W1E;2`M("YF:70 86YD("YF:71S(&5X=&5N<VEO;G,*<'5B;&EC(&EM;75T M("T +F1C;2!A;F0 +F1I8V]M(&5X=&5N<VEO;G,*<'5B;&EC(&EM;75T86)L M26YF:6YI='D 5V%R9"!);6%G92`M("YI=VD 97AT96YS:6]N"G!U8FQI8R!I M<F0 5&5X='5R92!&;W)M870 +2`N8FQP(&5X=&5N<VEO; IP=6)L:6, :6UM M=&%L.B!&04M+,B!497AT=7)E("T +F9T>"!E>'1E;G-I;VX*<'5B;&EC(&EM M;&0 ,B`M(%)E;&EC(%1E>'1U<F4 +2`N<F]T(&5X=&5N<VEO; IP=6)L:6, M9&EE=F%L($E).B!4;W1A;"!787( 5&5X='5R92`M("YT97AT=7)E(&5X=&5N M("`O+R$\($1I9VET86P 4&EC='5R92!%>&-H86YG92`M("YD<' 97AT96YS M("\O(3P 56YR96%L("AA;F0 56YR96%L(%1O=7)N86UE;G0I(%1E>'1U<F4 M+2`N=71X(&5X=&5N<VEO; IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?35`S M,R!E>'1E;G-I;VX*"B\O($]R:6=I;B!$969I;FET:6]N<PIP=6)L:6, :6UM M1494(#T ,' P-C`R.PIP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?3U))1TE. M,#L M,C$[" IP=6)L:6, :6UM=71A8FQE('5I;G0 24Q?24U!1T5?5TE$5$ )/2`P M*2!V;VED(&9U;F-T:6]N*'-I>F5?="P =6EN="HI(&EL1V5N26UA9V5S.PIP M=6)L:6, 97AT97)N*%-Y<W1E;2D =F]I9"!F=6YC=&EO;BAU:6YT*2!I;$)I M;F1);6%G93L*<'5B;&EC(&5X=&5R;BA3>7-T96TI('9O:60 9G5N8W1I;VXH M=6EN="P =6EN="HI(&EL1&5L971E26UA9V5S.PIP=6)L:6, 97AT97)N*%-Y M<W1E;2D =F]I9"!F=6YC=&EO;BAU:6YT+"!I;6UU=&%B;&4H8VAA<BDJ*2!I M;%-A=F4["G!U8FQI8R!E>'1E<FXH4WES=&5M*2!V;VED(&9U;F-T:6]N*&EM M;75T86)L92AC:&%R*2HI(&EL3&]A9$EM86=E.PIP=6)L:6, 97AT97)N*%-Y M<W1E;2D =F]I9"!F=6YC=&EO;BAI;6UU=&%B;&4H8VAA<BDJ*2!I;%-A=F5) M;6%G93L*<'5B;&EC(&5X=&5R;BA3>7-T96TI(&)O;VP 9G5N8W1I;VXH=6EN M="!W:61T:"P =6EN="!H96EG:'0L('5I;G0 9&5P=& L('5B>71E($)P<"P M=6EN="!F;W)M870L('5I;G0 ='EP92P =F]I9"H 9&%T82D :6Q497A);6%G M93L*<'5B;&EC(&5X=&5R;BA3>7-T96TI('5I;G0 9G5N8W1I;VXH*2!I;$=E M=$5R<F]R.PIP=6)L:6, 97AT97)N*%-Y<W1E;2D =F]I9"!F=6YC=&EO;B I M(&EL26YI=#L*<'5B;&EC(&5X=&5R;BA3>7-T96TI(&)O;VP 9G5N8W1I;VXH M=6EN="D :6Q/<FEG:6Y&=6YC.PIP=6)L:6, 97AT97)N*%-Y<W1E;2D 8F]O M;"!F=6YC=&EO;BAU:6YT*2!I;$5N86)L93L*<'5B;&EC(&5X=&5R;BA3>7-T M96TI(&)O;VP 9G5N8W1I;VXH=6EN="D :6Q$:7-A8FQE.PIP=6)L:6, 97AT M97)N*%-Y<W1E;2D :6YT(&9U;F-T:6]N*'5I;G0I(&EL1V5T26YT96=E<CL* M<'5B;&EC(&5X=&5R;BA3>7-T96TI('9O:60 9G5N8W1I;VXH=6EN="P =6EN M="P =6EN="P =6EN="P =6EN="P =6EN="P =6EN="P =6EN="P =F]I9"HI M(&EL0V]P>5!I>&5L<SL*"G9E<G-I;VXH5VEN9&]W<RD*>PH)<')I=F%T92!( M04Y$3$4 9&5V:6Q,:6)(86YD;&4["GT*96QS92!V97)S:6]N*&QI;G5X*0I[ M" EP<FEV871E('9O:60J(&1E=FEL3&EB2&%N9&QE.PI]"F5L<V4*>PH)<W1A M=&EC(&%S<V5R="AF86QS92D["GT*" IP<FEV871E('-T871I8R!T:&ES*"D* M>PH)=F5R<VEO;BA7:6YD;W=S*0H)>PH)"61E=FEL3&EB2&%N9&QE(#T 3&]A M9$QI8G)A<GE!*")$979)3"YD;&PB*3L*"0D*"0EI;$=E;DEM86=E<R`](&-A M<W0H=F]I9"!F=6YC=&EO;BAU:6YT+"!U:6YT*BDI1V5T4')O8T%D9')E<W,H M9&5V:6Q,:6)(86YD;&4L(")I;$=E;DEM86=E<R(I.PH)"6EL0FEN9$EM86=E M(#T 8V%S="AV;VED(&9U;F-T:6]N*'5I;G0I*4=E=%!R;V-!9&1R97-S*&1E M=FEL3&EB2&%N9&QE+"`B:6Q":6YD26UA9V4B*3L*"0EI;$1E;&5T94EM86=E M<R`](&-A<W0H=F]I9"!F=6YC=&EO;BAU:6YT+"!U:6YT*BDI1V5T4')O8T%D M9')E<W,H9&5V:6Q,:6)(86YD;&4L(")I;$1E;&5T94EM86=E<R(I.PH)"6EL M4V%V92`](&-A<W0H=F]I9"!F=6YC=&EO;BAU:6YT+"!I;6UU=&%B;&4H8VAA M<BDJ*2E'9710<F]C061D<F5S<RAD979I;$QI8DAA;F1L92P (FEL4V%V92(I M.PH)"6EL4V%V94EM86=E(#T 8V%S="AV;VED(&9U;F-T:6]N*&EM;75T86)L M92AC:&%R*2HI*4=E=%!R;V-!9&1R97-S*&1E=FEL3&EB2&%N9&QE+"`B:6Q3 M879E26UA9V4B*3L*"0EI;%1E>$EM86=E(#T 8V%S="AB;V]L(&9U;F-T:6]N M*'5I;G0L('5I;G0L('5I;G0L('5B>71E+"!U:6YT+"!U:6YT+"!V;VED*BDI M1V5T4')O8T%D9')E<W,H9&5V:6Q,:6)(86YD;&4L(")I;%1E>$EM86=E(BD[ M" D):6Q'971%<G)O<B`](&-A<W0H=6EN="!F=6YC=&EO;B I*4=E=%!R;V-! M9&1R97-S*&1E=FEL3&EB2&%N9&QE+"`B:6Q'971%<G)O<B(I.PH)"6EL26YI M="`](&-A<W0H=F]I9"!F=6YC=&EO;B I*4=E=%!R;V-!9&1R97-S*&1E=FEL M3&EB2&%N9&QE+"`B:6Q);FET(BD[" D):6Q/<FEG:6Y&=6YC(#T 8V%S="AB M;V]L(&9U;F-T:6]N*'5I;G0I*4=E=%!R;V-!9&1R97-S*&1E=FEL3&EB2&%N M9&QE+"`B:6Q/<FEG:6Y&=6YC(BD[" D):6Q%;F%B;&4 /2!C87-T*&)O;VP M9G5N8W1I;VXH=6EN="DI1V5T4')O8T%D9')E<W,H9&5V:6Q,:6)(86YD;&4L M(")I;$5N86)L92(I.PH)"6EL1&ES86)L92`](&-A<W0H8F]O;"!F=6YC=&EO M;BAU:6YT*2E'9710<F]C061D<F5S<RAD979I;$QI8DAA;F1L92P (FEL1&ES M86)L92(I.PH)"6EL1V5T26YT96=E<B`](&-A<W0H:6YT(&9U;F-T:6]N*'5I M;G0I*4=E=%!R;V-!9&1R97-S*&1E=FEL3&EB2&%N9&QE+"`B:6Q'971);G1E M9V5R(BD[" D):6Q,;V%D26UA9V4 /2!C87-T*'9O:60 9G5N8W1I;VXH:6UM M=71A8FQE*&-H87(I*BDI1V5T4')O8T%D9')E<W,H9&5V:6Q,:6)(86YD;&4L M(")I;$QO861);6%G92(I.PH)"6EL0V]P>5!I>&5L<R`](&-A<W0H=F]I9"!F M=6YC=&EO;BAU:6YT+"!U:6YT+"!U:6YT+"!U:6YT+"!U:6YT+"!U:6YT+"!U M:6YT+"!U:6YT+"!V;VED*BDI1V5T4')O8T%D9')E<W,H9&5V:6Q,:6)(86YD M;&4L(")I;$-O<'E0:7AE;',B*3L*"7T*"65L<V4 =F5R<VEO;BAL:6YU>"D* M"7L*"0ED979I;$QI8DAA;F1L92`](&1L;W!E;BAS=&0N<W1R:6YG+G1O4W1R M:6YG>B B;&EB24PN<V\B*2P 4E1,1%],05I9*3L*"0D*"0EI;$=E;DEM86=E M<R`](&-A<W0H=F]I9"!F=6YC=&EO;BAU:6YT+"!U:6YT*BDI9&QS>6TH9&5V M:6Q,:6)(86YD;&4L('-T9"YS=')I;F<N=&]3=')I;F=Z*")I;$=E;DEM86=E M<R(I*3L*"0EI;$)I;F1);6%G92`](&-A<W0H=F]I9"!F=6YC=&EO;BAU:6YT M*2ED;'-Y;2AD979I;$QI8DAA;F1L92P <W1D+G-T<FEN9RYT;U-T<FEN9WHH M(FEL0FEN9$EM86=E(BDI.PH)"6EL1&5L971E26UA9V5S(#T 8V%S="AV;VED M(&9U;F-T:6]N*'5I;G0L('5I;G0J*2ED;'-Y;2AD979I;$QI8DAA;F1L92P M<W1D+G-T<FEN9RYT;U-T<FEN9WHH(FEL1&5L971E26UA9V5S(BDI.PH)"6EL M4V%V92`](&-A<W0H=F]I9"!F=6YC=&EO;BAU:6YT+"!I;6UU=&%B;&4H8VAA M<BDJ*2ED;'-Y;2AD979I;$QI8DAA;F1L92P <W1D+G-T<FEN9RYT;U-T<FEN M9WHH(FEL4V%V92(I*3L*"0EI;%-A=F5);6%G92`](&-A<W0H=F]I9"!F=6YC M=&EO;BAI;6UU=&%B;&4H8VAA<BDJ*2ED;'-Y;2AD979I;$QI8DAA;F1L92P M<W1D+G-T<FEN9RYT;U-T<FEN9WHH(FEL4V%V94EM86=E(BDI.PH)"6EL5&5X M26UA9V4 /2!C87-T*&)O;VP 9G5N8W1I;VXH=6EN="P =6EN="P =6EN="P M=6)Y=&4L('5I;G0L('5I;G0L('9O:60J*2ED;'-Y;2AD979I;$QI8DAA;F1L M92P <W1D+G-T<FEN9RYT;U-T<FEN9WHH(FEL5&5X26UA9V4B*2D[" D):6Q' M971%<G)O<B`](&-A<W0H=6EN="!F=6YC=&EO;B I*61L<WEM*&1E=FEL3&EB M2&%N9&QE+"!S=&0N<W1R:6YG+G1O4W1R:6YG>B B:6Q'971%<G)O<B(I*3L* M"0EI;$EN:70 /2!C87-T*'9O:60 9G5N8W1I;VXH*2ED;'-Y;2AD979I;$QI M8DAA;F1L92P <W1D+G-T<FEN9RYT;U-T<FEN9WHH(FEL26YI="(I*3L*"0EI M;$]R:6=I;D9U;F, /2!C87-T*&)O;VP 9G5N8W1I;VXH=6EN="DI9&QS>6TH M9&5V:6Q,:6)(86YD;&4L('-T9"YS=')I;F<N=&]3=')I;F=Z*")I;$]R:6=I M;D9U;F,B*2D[" D):6Q%;F%B;&4 /2!C87-T*&)O;VP 9G5N8W1I;VXH=6EN M="DI9&QS>6TH9&5V:6Q,:6)(86YD;&4L('-T9"YS=')I;F<N=&]3=')I;F=Z M*")I;$5N86)L92(I*3L*"0EI;$1I<V%B;&4 /2!C87-T*&)O;VP 9G5N8W1I M;VXH=6EN="DI9&QS>6TH9&5V:6Q,:6)(86YD;&4L('-T9"YS=')I;F<N=&]3 M=')I;F=Z*")I;$1I<V%B;&4B*2D[" D):6Q'971);G1E9V5R(#T 8V%S="AI M;G0 9G5N8W1I;VXH=6EN="DI9&QS>6TH9&5V:6Q,:6)(86YD;&4L('-T9"YS M=')I;F<N=&]3=')I;F=Z*")I;$=E=$EN=&5G97(B*2D[" D):6Q,;V%D26UA M9V4 /2!C87-T*'9O:60 9G5N8W1I;VXH:6UM=71A8FQE*&-H87(I*BDI9&QS M>6TH9&5V:6Q,:6)(86YD;&4L('-T9"YS=')I;F<N=&]3=')I;F=Z*")I;$QO M861);6%G92(I*3L*"0EI;$-O<'E0:7AE;', /2!C87-T*'9O:60 9G5N8W1I M;VXH=6EN="P =6EN="P =6EN="P =6EN="P =6EN="P =6EN="P =6EN="P M=6EN="P =F]I9"HI*61L<WEM*&1E=FEL3&EB2&%N9&QE+"!S=&0N<W1R:6YG M871I8R!A<W-E<G0H9F%L<V4I.PH)?0I]" IP<FEV871E('-T871I8R!^=&AI (<R I"GL*?0H` ` end
Mar 01 2011
Assuming you've checked that dlopen isn't returning null, I can't find the source of the error in that code, sorry. Unsolicited advice: Is there any reason you're manually loading the dll rather than using an import library? A couple of remarks about the rest of the code: Generally in D the constants would all be: enum uint IL_BLAH = BLAH; rather than immutable. You can specify attributes such as public and immutable in blocks public immutable { // lots of constants } Or if using enums, the following will have the same effect. enum : uint { constant1 = value, constant2 = value, } All of your function pointers are currently thread local, as are the static ctor/dtors. To have them run once rather than once per thread, you should use 'shared static this()' and 'shared static ~this()' instead, and mark the function pointer variables as __gshared. In all of the 'pointer = cast(function pointer)dlsym(...);' calls you're actually relying on a compiler bug, as you're assigning a 'extern(D) something function(args)' to a 'extern(System) something function(args)'. For shorter, clearer and correct code you could instead use: blah = cast(typeof(blah))dlsym(...); You don't need to call std.string.toStringz on string literals, they're guaranteed to be null-terminated. All the function signatures using immutable (void function(immutable(char)*), etc) are incorrect. C or C++ function signatures should be using const instead (eg void function(const(char)*) ). I really suggest using an import library if possible.
Mar 02 2011
On 03/02/2011 01:49 AM, rm wrote:I put together bindings for DevIL in D to use on a school assignment. The bindings (attached) work fine on Windows, but cause a segfault on Linux when I call ilInit. this can be demonstrated by a little test program " import graphics.bindings.devil; public void main(string[] args) { ilInit(); } " compiled with "dmd -L-ldl test.d devil.d" where test.d is the above program and devil.d is attached. When run, this program segfaults, but if lines 112,113,165,166 of devil.d are commented out, the program works fine, and I can't figure out what the problem with those lines is. The fact that this works on Windows confuses me even more. Any help would be appreciated.On linux the linker is called with --export-dynamic by default and this tells the linker to export all the symbols pressent in your executable. So it is posible that dlsym is returning the address of the symbols in your execuable. Thunderbird is having some problems with your attachment so i'm not able to test, but renaming the functions should do the trick. -- Mike Wey
Mar 02 2011