gccarmnewliblibopencm3

Section `text` will not fit after upgrading `arm-none-eabi-gcc`


I have an open source micromouse robot project. For easier compilation, I use containers (both Podman and Docker should be fine):

make image
make libopencm3
make

This works just fine and generates a main.elf file about 874 kB in size. But that is as long as I fix the arm-none-eabi-gcc-cs to 7.4.0 in the Dockerfile.

If I remove the specific version or set it to 9.2.0, then I get the following error:

$ make
/usr/lib/gcc/arm-none-eabi/9.2.0/../../../../arm-none-eabi/bin/ld: main.elf section `.text' will not fit in region `rom'
/usr/lib/gcc/arm-none-eabi/9.2.0/../../../../arm-none-eabi/bin/ld: region `rom' overflowed by 5288 bytes
collect2: error: ld returned 1 exit status
make: *** [opencm3/libopencm3.rules.mk:204: main.elf] Error 1

What could have changed between those versions?

If I add this line to my Makefile:

LDFLAGS         += -specs=nano.specs

Then it compiles just fine with version 9.2.0 and generates a main.elf file about 885 kB in size. But I wonder if the performance would be the same (or equivalent) as before.

Update

I am expecting some performance differences, of course, just like I was expecting some differences in the binary size. But I was wondering if I could expect a higher than 20% difference in performance (specially if it could be now 20% slower).

The new binary is less than 2% bigger, and I would consider this to be "the same" as before. :-D


Solution

  • I do perfectly understand you want to use the latest and greatest toolchain from your prefered, mainstream Linux distribution, but this is not always going well.

    In my humble opinion, you should:

    Some remarks:

    Back to your specific issue now: I was able to compile your project using the following steps:

    wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2?revision=c34d758a-be0c-476e-a2de-af8c6e16a8a2?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,8-2019-q3-update" -O gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
    mkdir -p /opt/arm
    tar jxf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C /opt/arm
    export PATH=/opt/arm/gcc-arm-none-eabi-8-2019-q3-update/bin:$PATH
    

    Command which arm-none-eabi-gcc should display /opt/arm/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc.

    git clone --recurse-submodules https://github.com/Bulebots/bulebule.git
    cd bulebule
    scripts/setup_libopencm3.sh
    make -s -C src/
    

    Command arm-none-eabi-size ./src/main.elf should display:

    text    data     bss     dec     hex filename
    55152    3336    7100   65588   10034 ./src/main.elf
    

    Please note that there is a Docker file for the latest GCC toolchain from ARM targeting the cortex-m profile here. You may want to use it in your own Docker file and remove those two lines:

    arm-none-eabi-gcc-cs-7.4.0 \
    arm-none-eabi-newlib-3.1.0-2.fc30 \
    

    I hope this helps.