嵌入式平台code Size优化

embedded/2024/10/11 11:23:53/

背景

        在嵌入式平台中,为了节约存储空间、内存资源,通常需要降低目标bin文件的size。下面总结下code size的优化经验。本文所说的优化主要是指的C/C++代码binary/elf size。

统计工具

       工欲善其事必先利其器,首先介绍一下统计工具。在优化可执行文件size之前,要先统计一下目标文件各个段的大小,先把引起size变大的原因拆解清楚再逐个寻找优化点。介绍几个优化工具和使用方法。

map文件

        gcc/clang编译时加上-Wl,-Map=xxx.map可以生成map文件。通过map⽂件计算出某个全局变量、常量,函数代码段的size⼤⼩。map⽂件就是通过编译器编译、链接后之后生成的文件,包含函数入口地址、大小,全局变量地址、常量地址等⼀些重要信息。从map我们可以了解到:

  • 程序各区段的size,即⽬前存储器的使⽤量
  • 程序中各个symbol的地址
  • 各个symbol在存储器中的顺序关系
  • 可以大致看出哪些全局变量、函数代码过大。
  • 注意map文件有可能和目标elf中的符号不一样,如在编译map文件时带了unused的符号,而生成目标文件时又去掉了unused符号。

bloaty

        bloaty是google提供的一个工具,源码地址:项目首页 - bloaty - GitCode,可以从上面的链接中找到安装步骤和使用方法。

查看单个目标文件的size

        bloaty可以统计生成二进制文件的每个源文件、函数的大小,很适合对比库文件、elf文件。

bloaty xxx.elf -s vm -d compileunits -n 0 > xxx_per_file_size.txt
$ ./bloaty bloaty -d compileunitsFILE SIZE        VM SIZE    --------------  -------------- 34.8%  10.2Mi  43.4%  2.91Mi    [163 Others]17.2%  5.08Mi   4.3%   295Ki    third_party/protobuf/src/google/protobuf/descriptor.cc7.3%  2.14Mi   2.6%   179Ki    third_party/protobuf/src/google/protobuf/descriptor.pb.cc4.6%  1.36Mi   1.1%  78.4Ki    third_party/protobuf/src/google/protobuf/text_format.cc3.7%  1.10Mi   4.5%   311Ki    third_party/capstone/arch/ARM/ARMDisassembler.c1.3%   399Ki  15.9%  1.07Mi    third_party/capstone/arch/M68K/M68KDisassembler.c3.2%   980Ki   1.1%  75.3Ki    third_party/protobuf/src/google/protobuf/generated_message_reflection.cc3.2%   965Ki   0.6%  40.7Ki    third_party/protobuf/src/google/protobuf/descriptor_database.cc2.8%   854Ki  12.0%   819Ki    third_party/capstone/arch/X86/X86Mapping.

http://www.ppmy.cn/embedded/5515.html

相关文章

【Flutter】多语言方案二:GetX 版

介绍 多语言方案:GetX版,需要手动自定义字符串引用常量,优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹,文件夹下创建一个local.dart文件2.language文件夹下创…

51.基于SpringBoot + Vue实现的前后端分离-校园志愿者管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的校园志愿者管理系统设计与实现管理工…

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试 题目1:功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

1. A/B Test

文章目录 1、什么是A/B Testing ?2、A/B Testing 的用途?3、如何设计 A/B Testing?4、如何分析实验数据,得出结论?5、如何发行新产品并持续监测?学习链接 1、什么是A/B Testing ? A/B Testing …

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

精通MongoDB聚合操作API:深入探索高级技巧与实践

MongoDB 聚合操作API提供了强大的数据处理能力,能够对数据进行筛选、变换、分组、统计等复杂操作。本文介绍了MongoDB的基本用法和高级用法,高级用法涵盖了setWindowFields、merge、facet、expr、accumulator窗口函数、结果合并、多面聚合、查询表达式在…

Python 操作 json 数据

在Python中,操作JSON数据主要包括序列化(将Python对象转换为JSON格式)和反序列化(将JSON字符串转换回Python对象)。 以下是使用Python内置的json模块进行这些操作的基本示例: JSON 序列化 (Serialization…