你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何删除编译过程中未使用的section

[复制链接]
gaosmile 发布时间:2020-11-22 09:40
  • 1 前言
  • 2 ELF格式
  • 3 编译器

    • 3.1 ARMCC
    • 3.2 GCC

  • 4 IDE

    • 4.1 MDK的设置
    • 4.2 CubeIDE

  • 5 结论


1 前言
我们平时做项目的时候,随着代码量的增加,工程变得更加臃肿,但是实际上可能只使用到其中一部分函数,与此同时,还有一部分是已经定义但是没有被使用的函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间
或者在使用静态库的时候,这种现象更加明显。比如,我们只需要使用静态库中的几个功能,但是编译器默认会把整个静态库全部链接到可执行程序中,从而导致可执行程序的大小大大增加。
那该如何避免这种情况呢?大部分工作交给编译器,我们只要告诉编译器不要把这些程序编译到可执行文件中即可。下面会继续解释。
2 ELF格式
ELF(Executable and Linkable Format)是可执行和可链接格式。在Linux上ELF包括了链接过程中的目标文件(.o),共享库(.so)和可执行文件,同时还用于可加载的内核模块,因此作为链接过程中的目标文件也是通过ELF格式的文件来表示的;
ELF的结构至少包含两个头:
  • ELF头
  • 程序头
  • 通常还会有一个节标头;
具体如下图所示;
微信图片_20201122093544.jpg
从图中我们可以看到,这里可以分为两种情况;
  • Linking:链接是按节划分的,在链接程序时会这样使用,这些部分包含一些目标文件信息,例如:数据,指令,重定位信息,符号,调试信息等等;
  • Exection:程序执行期间使用按段划分的执行视图。
下面是ELF格式文件的详细布局图;
微信图片_20201122093552.png
3 编译器
通常在做ARM开发的时候会使用ARMCC和GCC,可以参考相应编译器的手册,使用相应的编译命令就可以实现对程序的优化。
3.1 ARMCC
在ARMCC中,编译器通常将函数和数据放在一起,并且将每一个类别规整到同一个section中,如果在链接的时候发现某个section没有被使用,那么就会将这个section删除,从而减少可执行文件的大小。
可以使用--split_sections编译器命令行选项来指示编译器为源文件中的每个函数生成一个ELF节,这样在链接的时候可以通过--remove命令让链接器删除未使用的section。
3.2 GCC
GCC在编译时可以使用 -ffunction-sections和 -fdata-sections 将每个函数或符号创建为一个section;链接阶段的时候,使用 -Wl,–gc-sections 来告诉链接器删除不需要的section(其中-Wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。
4 IDE
通常我们使用IDE的过程中,它已经帮我们做好了很多工作,比如上面提到的编译器命令需要我们自己手动写到Makefile中,但是在IDE只需要勾选相应的选项即可;
4.1 MDK的设置
MDK中使用的是ARMCC编译器,以STM32为例,纯净的HAL编译之后的结果如下图所示;
微信图片_20201122093604.png
在工程的Opentios下勾选One ELF Section per Function,发现在编译器命令自动追加了--splot_sections;
微信图片_20201122093607.png
最终编译的结果如下,发现最终固件变小了很多;
微信图片_20201122093611.png 4.2 CubeIDE
CubeIDE中使用的是arm-none-eabi-gcc,相同的代码与上面的基本相同,创建CubeIDE的工程,编译之后如下图所示;
微信图片_20201122093616.png
同样在项目的属性设置中,增加--ffunction-sections选项和-fdata-sections选项之后,构建项目;
微信图片_20201122093620.png
最终结果如下所示,发现固件的大小减小很多;
微信图片_20201122093623.png
5 结论
本文对于如何删除编译过程中未使用的section做了简单的介绍,从ELF文件格式的角度出发,介绍了编译器ARMCC和GCC相应的命令以及MDK,CubeIDE中的相应配置,最终实验表明可以减少程序大小,另外编译器的优化等级-O1,-O2,-O3也可以优化程序的大小以及执行时间,但是由于存在太多不可控性,不太建议开编译器的优化等级。


收藏 评论0 发布时间:2020-11-22 09:40

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版