Arm STM32F103铿锵编译和大二进制大小

Arm STM32F103铿锵编译和大二进制大小,arm,clang,llvm,cross-compiling,stm32,Arm,Clang,Llvm,Cross Compiling,Stm32,我正在尝试使用clang编译器和GNU Arm嵌入式工具链汇编器+链接器+库为STM32F103构建LED闪烁器。我的主机系统是Debian x86_64。我使用STM32CubeMX(基于GCC)中生成的Makefile项目,并对Makefile进行了一些更改。但是,当使用原始多维数据集项目创建的bin为5KB时,结果二进制文件的大小为16KB。此外,我注意到使用sprintf()(用于UART)会将大小增加到51KB。我知道动态内存分配可能会消耗大量空间,但对于相同的代码,在Cube项目中创

我正在尝试使用clang编译器和GNU Arm嵌入式工具链汇编器+链接器+库为STM32F103构建LED闪烁器。我的主机系统是Debian x86_64。我使用STM32CubeMX(基于GCC)中生成的Makefile项目,并对Makefile进行了一些更改。但是,当使用原始多维数据集项目创建的bin为5KB时,结果二进制文件的大小为16KB。此外,我注意到使用sprintf()(用于UART)会将大小增加到51KB。我知道动态内存分配可能会消耗大量空间,但对于相同的代码,在Cube项目中创建的bin的大小只有7KB

如何减少clang+GNU工具链配置的二进制大小

汇编:

clang -c --target=armv7m-none-eabi -mcpu=cortex-m3 -mthumb $(INCLUDES) -O2 -fdata-sections -ffunction-sections file.c -o file.o
arm-none-eabi-as startup_stm32f103xb.S -o startup_stm32f103xb.o
链接:

 clang -v -nostdlib --target=armv7m-none-eabi -mcpu=cortex-m3 \
    --ld-path=/path/to/gcc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-gcc \ 
    -TSTM32F103C8Tx_FLASH.ld \
    -L"/path/to/gcc-arm-none-eabi-9-2020-q2-update/lib/gcc/arm-none-eabi/9.3.1/thumb/v7-m/nofp" \
    -L"/path/to/gcc-arm-none-eabi-9-2020-q2-update/arm-none-eabi/lib/thumb/v7-m/nofp/" \
    $(OBJECTS) startup_stm32f103xb.o \ 
    -o out
获取二进制文件:

 arm-none-eabi-objcopy -O binary -S out out.bin
有些功能和对象确实占用空间,主要是与动态内存管理相关的功能和对象,例如:

$readelf -a out
...
775: 080049b9  6992 FUNC    GLOBAL DEFAULT    2 _svfprintf_r
964: 20000444  1032 OBJECT  GLOBAL DEFAULT    7 __malloc_av_
993: 08006709  3784 FUNC    GLOBAL DEFAULT    2 _dtoa_r
994: 080078e5  1372 FUNC    GLOBAL DEFAULT    2 _malloc_r
1032: 08008b29  2852 FUNC    GLOBAL DEFAULT    2 _svfiprintf_r
1073: 08009e41  3372 FUNC    GLOBAL DEFAULT    2 _vfiprintf_r
...

C库非常庞大,printf风格非常丰富。一个C库实现不应与另一个匹配。真正的问题是为什么要使用sfprintf,以及在裸机应用程序中如何避免它。下一个问题是,如果你有一个解决方案,那么就坚持使用它……为什么要更改工具。不要使用任何printf风格,也不要使用大多数C库是控制二进制大小的主要方法。使用nano stdlib实现。add-specs=nosys.specs-specs=nano.specs我需要在LLVM IR中进行一些代码转换,这就是更改为clang的原因。我已经有一个正在工作的LLVM项目,但是即使不使用printf、malloc等,二进制文件的大小也会急剧增加。所以我认为我的解决方案可能有问题。@P_ujsupportswomenipland,添加了这些标志,不幸的是,可执行文件和二进制文件的大小没有变化。C库非常庞大,printf的口味非常丰富。一个C库实现不应与另一个匹配。真正的问题是为什么要使用sfprintf,以及在裸机应用程序中如何避免它。下一个问题是,如果你有一个解决方案,那么就坚持使用它……为什么要更改工具。不要使用任何printf风格,也不要使用大多数C库是控制二进制大小的主要方法。使用nano stdlib实现。add-specs=nosys.specs-specs=nano.specs我需要在LLVM IR中进行一些代码转换,这就是更改为clang的原因。我已经有一个正在工作的LLVM项目,但即使不使用printf、malloc等,二进制文件的大小也会急剧增加。因此我认为我的解决方案可能有问题。@P_ujsupportswomenipland,添加了这些标志,不幸的是,可执行文件和二进制文件的大小没有变化