Cannot build GCC for Cortex-M0

Kai Ruottu kai.ruottu@wippies.com
Thu Sep 2 19:28:00 GMT 2010


2.9.2010 16:41, Kai Ruottu kirjoitti:

> Instead of adding rows you maybe should comment away the later :
>
> MULTILIB_OPTIONS += mfloat-abi=hard
> MULTILIB_DIRNAMES += fpu
> MULTILIB_EXCEPTIONS += *mthumb/*mfloat-abi=hard*
>
> with '#' first in the line. And uncomment the interwork settings :
>
> # MULTILIB_OPTIONS += mno-thumb-interwork/mthumb-interwork
> # MULTILIB_DIRNAMES += normal interwork
<clip>
> I will try this myself, first I only removed the '--disable-multilib'
> and '--disable-interwork', didn't edit the multilib defs,
>
> Let's comment the extra multilib defs away and see where the smoke rises
> then...

There was no smoke in libgcc, multilibs were produced into the

libgcc
interwork/libgcc
thumb/libgcc
thumb/interwork/libgcc

the default one and the '-mthumb' one had different sizes...
The next step was to try a normal 'arm-eabi' targeted toolchain
with an added '-mcpu=cortex-m0' specific multilib, so I added
the following ('+') :

# MULTILIB_EXCEPTIONS += *mthumb/*mcpu=ep9312*
#
+MULTILIB_OPTIONS    += mcpu=cortex-m0
+MULTILIB_DIRNAMES   += cortex-m0
+MULTILIB_EXCEPTIONS += *mthumb/*mcpu=cortex-m0*
#
# MULTILIB_OPTIONS     += mlittle-endian/mbig-endian

and :

MULTILIB_OPTIONS    += mno-thumb-interwork/mthumb-interwork
MULTILIB_DIRNAMES   += normal interwork
+MULTILIB_EXCEPTIONS += *mthumb-interwork/*mcpu=cortex-m0*

to the 'gcc/config/arm/t-arm-elf'.  And then removed the options
'--with-cpu=cortex-m0 --with-mode=thumb' from the GCC configure
command.

The smoke rose from use of the bare '-mcpu=cortex-m0' when the
default 'mode' was '-marm'. So something must be invented for
this. My first hack was to add also '-mthumb' when '-mcpu=cortex-m0'
was used. And put this into 'gcc/config/arm/unknown-elf.h' :

-------------- clip ----------------
*** unknown-elf.h.orig  2010-09-02 20:29:22.000000000 +0300
--- unknown-elf.h       2010-09-02 20:34:51.000000000 +0300
***************
*** 46,52 ****
   /* The __USES_INITFINI__ define is tested in newlib/libc/sys/arm/crt0.S
      to see if it needs to invoked _init() and _fini().  */
   #undef  SUBTARGET_CPP_SPEC
! #define SUBTARGET_CPP_SPEC  "-D__USES_INITFINI__"

   #undef  PREFERRED_DEBUGGING_TYPE
   #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
--- 46,52 ----
   /* The __USES_INITFINI__ define is tested in newlib/libc/sys/arm/crt0.S
      to see if it needs to invoked _init() and _fini().  */
   #undef  SUBTARGET_CPP_SPEC
! #define SUBTARGET_CPP_SPEC  "%{mcpu=cortex-m0:-mthumb} 
-D__USES_INITFINI__"

   #undef  PREFERRED_DEBUGGING_TYPE
   #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-------------- clip ----------------

Maybe not in the right place but it worked...

The default assembly code starts with something like :

         .cpu arm7tdmi
         .fpu softvfp
         .eabi_attribute 20, 1
         .eabi_attribute 21, 1
         .eabi_attribute 23, 3

and when using '-mcpu=cortex-m0', it changes to :

         .cpu cortex-m0
         .fpu softvfp
         .eabi_attribute 20, 1
         .eabi_attribute 21, 1
         .eabi_attribute 23, 3

So with the previous fixes you should get a GCC which produces
code for armv7tdmi as default and for cortex-m0 with the proper
option and includes multilibs for the arm7tdmi variations, with
-mthumb and -mthumb-interworking, plus the '-mcpu=cortex-m0'
specific multilibs...



More information about the Gcc-help mailing list