coldfire and soft-float

Luigi 'Comio' Mantellini
Thu Jun 19 07:35:00 GMT 2008

Kay, Thanks for your support.

this is the config.gcc (part of):

m68k-*-uclinux*)                # Motorola m68k/ColdFire running uClinux
                                # with uClibc, using the new GNU/Linux-style
                                # ABI.
        tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h flat.h m68k/linux.h m68k/uclinux.h ./sysroot-suffix.h"
        tm_defines="${tm_defines} MOTOROLA=1 UCLIBC_DEFAULT=1"
        extra_options="${extra_options} linux.opt"
        tmake_file="m68k/t-floatlib m68k/t-uclinux m68k/t-mlibs"
m68k-*-linux*)          # Motorola m68k's running GNU/Linux
                                # with ELF format using glibc 2
                                # aka the GNU/Linux C library 6.
        tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h m68k/linux.h"
        extra_options="${extra_options} m68k/ieee.opt"
        tm_defines="${tm_defines} MOTOROLA=1"
        # if not configured with --enable-sjlj-exceptions, bump the
        # libgcc version number
        if test x$sjlj != x1; then
            tmake_file="$tmake_file m68k/t-slibgcc-elf-ver"

The target m68k-*-linux* doesn't set any tmake_file... I think that the
following should be added :

        tmake_file="m68k/t-floatlib m68k/t-mlibs m68k/t-m68kbare"



On gio, 2008-06-19 at 01:41 +0300, Kai Ruottu wrote:
> Luigi 'Comio' Mantellini wrote:
> >> - If it doesn't, why you think that the default for Coldfire isn't
> >>    using the '-msoft-float' and including the base soft-float routines
> >>    into the 'libgcc' ?
> >>
> > I'm confused.. this the error:
> > 
> > rm -f lib/ lib/ lib/
> > m68k-linux-uclibc-ld  -shared --warn-common --warn-once
>  > 
> /mnt/devel/openwrt/OpenWRT.git/staging_dir/toolchain-m68k_gcc4.3.1/lib/gcc/m68k-linux-uclibc/4.3.1/libgcc.a 
> > libc/libc_so.a(difftime.os): In function `difftime':
> > difftime.c:(.text+0xe): undefined reference to `__floatsidf'
> > difftime.c:(.text+0x2a): undefined reference to `__subdf3'
> Maybe there is some bug with Linux versus uClinux things. Linux uses
> glibc and at least in the PPC case this has those soft-float routines.
> Linux-uClibc uses uClibc and maybe this hasn't those routines but the
> 'libgcc.a' should have them...
> In any case the first step would be to compare the config templates
> for 'm68k-linux-gnu' and 'm68k-linux-uclibc' in 'gcc/config.gcc' and
> see whether the latter has the 'm68k/t-softfp' or something like that
> 'target makefile fragment' added to the 'linux-uclibc' one... They may
> differ in other things too but for this problem those target makefile
> fragments ('t-files') in 'gcc/config/m68k' would be the key. I haven't
> the gcc-4.3.1 sources available for looking just now so I cannot look
> what the proper 't-file' was. Basically between these two Linux 
> variations there shouldn't be very much differences.
> In any case it would be useful to learn the GCC config chain from the
> target template in 'gcc/config.gcc' to those config files in the
> 'gcc/config/<CPU>' and see what the problem could be. In this case I
> would expect the target template requiring 'case handling' for the 
> different 'm68k' (m68020/m68881) and 'mcf' (Coldfire) CPU cases, the
> latter adding the required soft-float routines into the resulting
> 'libgcc.a' via the proper 'tmake-file' addition...  The Linux/m68k
> configuration probably expects a m68881/m68882 FPU always being on
> the target system.
> > libc/libc_so.a(_fpmaxtostr.os): In function `_fpmaxtostr':
> > _fpmaxtostr.c:(.text+0x8a): undefined reference to `__nedf2'
> > _fpmaxtostr.c:(.text+0x18c): undefined reference to `__eqdf2'
> > _fpmaxtostr.c:(.text+0x1aa): undefined reference to `__divdf3'
> > _fpmaxtostr.c:(.text+0x1be): undefined reference to `__ltdf2'
> > _fpmaxtostr.c:(.text+0x212): undefined reference to `__floatunsidf'
> > _fpmaxtostr.c:(.text+0x238): undefined reference to `__muldf3'
> > _fpmaxtostr.c:(.text+0x656): undefined reference to `__gedf2'
> Checking that the :
> ...../lib/gcc/m68k-linux-uclibc/4.3.1/libgcc.a
> really hasn't these symbols in it, using the 'm68k-linux-uclibc-nm'
> for it, would though be the first task. Compiling those 'm68k/float.c'
> etc things should add them...
Industrie Dial Face S.p.A.
Luigi Mantellini
R&D - Software
Industrie Dial Face S.p.A.
Via Canzo, 4 
20068 Peschiera Borromeo (MI), Italy
Tel.:   +39 02 5167 2813
Fax:    +39 02 5167 2459
GPG fingerprint: 3DD1 7B71 FBDF 6376
                 B003 175F E979 907E

More information about the Gcc-help mailing list