Search code examples
linuxgccembeddedcortex-mtoolchain

Linux kernel on ARM Cortex-M: how to build proper executables


I need to build a complete linux development framework for a Cortex-M MCU, specifically a STM32F7 Cortex-M7. First I've to explain some background info so please bear with me.

I've downloaded and built a gcc toolchain with croostool-ng 1.24 specifying an armv7e-m architecture with thumb-only instructions and linux 4.20 as the OS and that I want the output to be FLAT executables (I assumed it will mean bFLT).

Then I proceeded to compile the linux kernel (version 4.20) using configs/stm32_defconf, and then a statically compiled busybox rootfs, all using my new toolchain.

Kernel booted just fine but throw me an error and kernel painc with the following message:

Starting init: /sbin/init exists but couldn't execute it (error -8)

and

request_module: modprobe binfmt-464c cannot be processed, kmod busy with 50 threads

The interesting part is the last message. My busybox excutable turned out to be an .ELF! Cortex-M has no MMU, so it's imposible to build a linux kernel on a MMU-less architecture with .ELF support, that's why an (464c)"LF" binary loader can't be found, there is none.

So at last, my question is:

how could I build bFLT executables to run on MMU-less Linux architectures? My toolchain has elf2flt, but in crosstool-ng I've already specified a MMU-less architecture and FLAT binary and I was expecting direct bFLT output, not a "useless" executable. Is that even possible?

Or better: is there anywhere a documented standard procedure to build a complete, working Linux system based on Cortex-M?

Follow-up:

I gave up on building FLAT binaries and tried FDPIC executables. Another dead end. AFAIK:

  1. Linux has long been supporting ELF FDPIC, but the ABI for ARM is pretty new.
  2. It seems that still at this day and age, GCC has not a standard way to enable FDPIC. On some architectures you can use -mfdpic. Not on arm, don't know why. I even don't know if ARM FDPIC is supported at all by mainline GCC. Info is extremely scarce if inexistent.
  3. It seems crosstool-ng 1.24 is BROKEN at building ARM ELF FDPIC support. Resulting gcc has not -mfdpic, and -fPIC generates ARM executables, not ARM FDPIC.

Any insight will be very appreciated.


Solution

  • We are successfully running Linux on Cortex-M3/4/7 machines. We are using 2x kinds of toolchains:

    Hope this helps.