On Wed, 11 Mar 2009 00:57:53 +0100, "Vincent R." <forumer@xxxxxxxxxxxxxxx> wrote: > On Tue, 10 Mar 2009 23:29:46 +0100, "Vincent R." <forumer@xxxxxxxxxxxxxxx> > wrote: >> On Tue, 10 Mar 2009 23:55:02 +0200, Kai Ruottu <kai.ruottu@xxxxxxxxxxx> >> wrote: >>> Kai Ruottu wrote: >>> >>>> Vincent R. wrote: >>>>> Hi, >>>>> >>>>> When compiling the following code with a gcc 4.4 cross-compiler >>>>> targetting >>>>> arm wince platform I get a problem with undefined reference > __floatdidf >>>>> : >>>> >>>> This should mean a conversion routine from long int to double float >>>> and this routine is normally in libgcc... So a search with 'nm' >>>> would tell if it is there or not. >>> >>> A quick look in 'gcc/config/arm' told that the 'lib1funcs.asm' should >>> #include the 'ieee754-*.S' which has this routine. But there are two >>> conditions for the inclusion : >>> >>> #ifndef __symbian__ >>> #ifndef __ARM_ARCH_6M__ >>> #include "ieee754-df.S" >>> #include "ieee754-sf.S" >>> #include "bpabi.S" >>> #else /* __ARM_ARCH_6M__ */ >>> #include "bpabi-v6m.S" >>> #endif /* __ARM_ARCH_6M__ */ >>> #endif /* !__symbian__ */ >>> >>> Whether the WinCE target defines something like these will be left you >>> as a homework... >> >> When using nm with gcc-4.4: >> >> $ arm-mingw32ce-nm libgcc.a | grep float >> _floatdidf.o: >> _floatdisf.o: >> U __floatunsidf >> U __floatunsidf >> _floatdixf.o: >> _floatditf.o: >> _floatundisf.o: >> 00000000 T __floatundisf >> U __floatunsidf >> _floatundidf.o: >> 00000000 T __floatundidf >> U __floatunsidf >> _floatundixf.o: >> _floatunditf.o: >> 0000000c T __floatsisf >> 0000000c T __floatunsisf >> 0000000c T __floatsidf >> 0000000c T __floatunsidf >> >> with an old working version (4.1.2): >> >> 0000038c T __floatdidf >> 00000310 T __floatsidf >> 00000378 T __floatundidf >> 000002ec T __floatunsidf >> 00000200 T __floatdisf >> 000001d0 T __floatsisf >> 000001f0 T __floatundisf >> 000001c8 T __floatunsisf >> _floatdidf.o: >> _floatdisf.o: >> U __floatsidf >> U __floatsidf >> _floatdixf.o: >> _floatditf.o: >> 00000000 T __floatsisf >> 00000000 T __floatunsisf >> 00000000 T __floatsidf >> 00000000 T __floatunsidf >> >> >> and since __symbian__ nor __ARM_ARCH_6M__ are defined I suppose > ieee754-*.S >> are included. >> >> From what I see with old version __floatxxx were defined bur not with new >> compiler. >> > I found why it's because of the following test : > > #ifdef L_arm_addsubdf3 > ... > #endif > > Now I need to find why L_arm_addsubdf3 is defined. So I am still stuck with this mising symbol. What I don't understand is the fact that __floatundidf is defined but not __floatdidf. If I look in gcc/config/arm/t-wince-pe here is what is declared for my target: LIB1ASMSRC = arm/lib1funcs.asm LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 \ _bb_init_func _lshrdi3 _ashrdi3 _ashldi3 \ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ _fixsfsi _fixunssfsi _floatdidf _floatdisf \ _arm_fixunsdfsi and I can see that