【ARM 嵌入式 编译系列 10.1 -- GCC 编译缩减可执行文件 elf 文件大小】

文章目录

上篇文章:ARM 嵌入式 编译系列 10 – GCC 编译缩减可执行文件 elf 文件大小

接着上篇文章 ARM 嵌入式 编译系列 10 – GCC 编译缩减可执行文件 elf 文件大小 的介绍,我们看下如何进一步缩小可执行文件test的大小。上篇文章通过 strip --strip-debug test 已经将 可执行文件 test 的大小从 17464减小到了15912 bytes 。

加下继续缩减就是删除 符号表了,使用:strip命令,或者strip --strip-all命令:

$ strip --strip-all test
ls -rtl test
-rwxrwxr-x 1 sam sam 14472  814 12:34 test

此时的可执行程序test已经从15912 bytes进一步减小到了14472bytes了。

此时符号表已经不在了:

sam@sam-Think:~$ nm test
nm: test: no symbols

symtabstrtab 2 个 section不见了,section 从31个减少到了29个:

sam@sam-Think:~$ readelf  -S test
There are 29 section headers, starting at offset 0x3148:Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .interp           PROGBITS         0000000000000318  00000318000000000000001c  0000000000000000   A       0     0     1[ 2] .note.gnu.pr[...] NOTE             0000000000000338  000003380000000000000030  0000000000000000   A       0     0     8[ 3] .note.gnu.bu[...] NOTE             0000000000000368  000003680000000000000024  0000000000000000   A       0     0     4[ 4] .note.ABI-tag     NOTE             000000000000038c  0000038c0000000000000020  0000000000000000   A       0     0     4[ 5] .gnu.hash         GNU_HASH         00000000000003b0  000003b00000000000000024  0000000000000000   A       6     0     8[ 6] .dynsym           DYNSYM           00000000000003d8  000003d800000000000000c0  0000000000000018   A       7     1     8[ 7] .dynstr           STRTAB           0000000000000498  000004980000000000000094  0000000000000000   A       0     0     1[ 8] .gnu.version      VERSYM           000000000000052c  0000052c0000000000000010  0000000000000002   A       6     0     2[ 9] .gnu.version_r    VERNEED          0000000000000540  000005400000000000000030  0000000000000000   A       7     1     8[10] .rela.dyn         RELA             0000000000000570  0000057000000000000000c0  0000000000000018   A       6     0     8[11] .rela.plt         RELA             0000000000000630  000006300000000000000030  0000000000000018  AI       6    24     8[12] .init             PROGBITS         0000000000001000  00001000000000000000001b  0000000000000000  AX       0     0     4[13] .plt              PROGBITS         0000000000001020  000010200000000000000030  0000000000000010  AX       0     0     16[14] .plt.got          PROGBITS         0000000000001050  000010500000000000000010  0000000000000010  AX       0     0     16[15] .plt.sec          PROGBITS         0000000000001060  000010600000000000000020  0000000000000010  AX       0     0     16[16] .text             PROGBITS         0000000000001080  00001080000000000000017b  0000000000000000  AX       0     0     16[17] .fini             PROGBITS         00000000000011fc  000011fc000000000000000d  0000000000000000  AX       0     0     4[18] .rodata           PROGBITS         0000000000002000  000020000000000000000055  0000000000000000   A       0     0     4[19] .eh_frame_hdr     PROGBITS         0000000000002058  000020580000000000000044  0000000000000000   A       0     0     4[20] .eh_frame         PROGBITS         00000000000020a0  000020a000000000000000ec  0000000000000000   A       0     0     8[21] .init_array       INIT_ARRAY       0000000000003db0  00002db00000000000000008  0000000000000008  WA       0     0     8[22] .fini_array       FINI_ARRAY       0000000000003db8  00002db80000000000000008  0000000000000008  WA       0     0     8[23] .dynamic          DYNAMIC          0000000000003dc0  00002dc000000000000001f0  0000000000000010  WA       7     0     8[24] .got              PROGBITS         0000000000003fb0  00002fb00000000000000050  0000000000000008  WA       0     0     8[25] .data             PROGBITS         0000000000004000  000030000000000000000010  0000000000000000  WA       0     0     8[26] .bss              NOBITS           0000000000004010  000030100000000000000008  0000000000000000  WA       0     0     1[27] .comment          PROGBITS         0000000000000000  00003010000000000000002b  0000000000000001  MS       0     0     1[28] .shstrtab         STRTAB           0000000000000000  0000303b000000000000010a  0000000000000000           0     0     1

能不能进一步缩减可执行文件的 size 呢答案是肯定的
上面 section中 .note.ABI-tag , .gnu.version ,.plt , .plt.got, .comment 都是可以移除,移除后的信息如下,

:~$ objcopy -R .note.ABI-tag -R .gnu.version -R .gnu.version_r -R .comment test
:~$ nm test
nm: test: no symbols
:~$ readelf -S test
There are 25 section headers, starting at offset 0x30e8:Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .interp           PROGBITS         0000000000000318  00000318000000000000001c  0000000000000000   A       0     0     1[ 2] .note.gnu.pr[...] NOTE             0000000000000338  000003380000000000000030  0000000000000000   A       0     0     8[ 3] .note.gnu.bu[...] NOTE             0000000000000368  000003680000000000000024  0000000000000000   A       0     0     4[ 4] .gnu.hash         GNU_HASH         00000000000003b0  000003b00000000000000024  0000000000000000   A       5     0     8[ 5] .dynsym           DYNSYM           00000000000003d8  000003d800000000000000c0  0000000000000018   A       6     1     8[ 6] .dynstr           STRTAB           0000000000000498  000004980000000000000094  0000000000000000   A       0     0     1[ 7] .rela.dyn         RELA             0000000000000570  0000057000000000000000c0  0000000000000018   A       5     0     8[ 8] .rela.plt         RELA             0000000000000630  000006300000000000000030  0000000000000018  AI       5    21     8[ 9] .init             PROGBITS         0000000000001000  00001000000000000000001b  0000000000000000  AX       0     0     4[10] .plt              PROGBITS         0000000000001020  000010200000000000000030  0000000000000010  AX       0     0     16[11] .plt.got          PROGBITS         0000000000001050  000010500000000000000010  0000000000000010  AX       0     0     16[12] .plt.sec          PROGBITS         0000000000001060  000010600000000000000020  0000000000000010  AX       0     0     16[13] .text             PROGBITS         0000000000001080  00001080000000000000017b  0000000000000000  AX       0     0     16[14] .fini             PROGBITS         00000000000011fc  000011fc000000000000000d  0000000000000000  AX       0     0     4[15] .rodata           PROGBITS         0000000000002000  000020000000000000000055  0000000000000000   A       0     0     4[16] .eh_frame_hdr     PROGBITS         0000000000002058  000020580000000000000044  0000000000000000   A       0     0     4[17] .eh_frame         PROGBITS         00000000000020a0  000020a000000000000000ec  0000000000000000   A       0     0     8[18] .init_array       INIT_ARRAY       0000000000003db0  00002db00000000000000008  0000000000000008  WA       0     0     8[19] .fini_array       FINI_ARRAY       0000000000003db8  00002db80000000000000008  0000000000000008  WA       0     0     8[20] .dynamic          DYNAMIC          0000000000003dc0  00002dc000000000000001f0  0000000000000010  WA       6     0     8[21] .got              PROGBITS         0000000000003fb0  00002fb00000000000000050  0000000000000008  WA       0     0     8[22] .data             PROGBITS         0000000000004000  000030000000000000000010  0000000000000000  WA       0     0     8[23] .bss              NOBITS           0000000000004010  000030100000000000000008  0000000000000000  WA       0     0     1[24] .shstrtab         STRTAB           0000000000000000  0000301000000000000000d7  0000000000000000 
ls -rtl test
-rwxrwxr-x 1 selab selab 14120  814 12:44 test

可以看到 test 可执行程序再次减小了,从 14472bytes 减小到了 14120bytes, 到目前位置,程序依然是可执行的

:~$ ./test
I am main, I wll can foo
I am foo,I will call bar
I am bar,I will core dump
Segmentation fault (core dumped)

当然了,这种操作其实没必要,对于大型程序而言,用 strip 移除符号表,文件会变小很多,但是用objcopy移除上面几个个 section,节省不了多少空间。

到目前为止,文件越来越小,节省了大量的空间。现在我们把符号表移除了,如果发生了coredump我们将无法定位信息

:~$ gdb -c /tmp/corefile/core.test.1691988924.1181895
Core was generated by `./test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000055621e1941ab in ?? ()
(gdb) bt
#0  0x000055621e1941ab in ?? ()
#1  0x00007ffdc95cf768 in ?? ()
#2  0x0000000000000000 in ?? ()
(gdb)

那么接下来如何处理呢? 请见下篇文章。

上篇文章:ARM 嵌入式 编译系列 10 – GCC 编译缩减可执行文件 elf 文件大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RunnerGo的相比较JMeter优势,能不能替代?

目前在性能测试领域市场jmeter占有率是非常高的,主要原因是相对比其他性能测试工具使用更简单(开源、易扩展),功能更强大(满足多种协议的接口),但是随着研发协同的升级,平台化的性能…

进程的概念和特征

进程的概念和特征 进程的概念进程的特征 进程的概念 在多道程序环境下,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(process)的概念,以便更好的描述和控制…

【Java】常用工具——异常

1. try-catch-finnaly try必须和catch或者finally组合使用; public class TryDemoOne {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.println("输入第1个整数:");int one input.nextInt();S…

主流的嵌入式微处理器

目前主流的嵌入式微处理器系列有: ARM系列 MIPS系列 PowerPC系列 Super H系列 一、MPC/PPC系列 PowerPC(简称PPC),其基本设计源自IBM的POWER.1991年,APPLE(苹果电脑)、IBM、Motorola(摩托罗拉)组成的AIM联盟发展出Power微处理器…

mybatis-plus 根据指定字段 批量 删除/修改

mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办 方案一: 手写SQL方案二: 手动获取SqlSessionTemplate 就是把mybatis plus 干的事自己干了方案三 : 重写 executeBatch 方法结论: mybatis-plus 提供了根据id批量更新和修改的方法,…

Python jupyter lab 设置

在下载好jupyter lab 后,需要对其进行设置,尤其是远程服务器的时候,因为根本就是没有屏幕,也没有浏览器。 新建设置文件 jupyter lab --generate-config设置文件内部参数 vim ~/.jupyter/jupyter_lab_config.py进去一通改&#…

网络编程(8.15)io模型,IO多路复用(select,poll)

1.使用select函数实现IO多路复用 使用select函数实现IO多路复用的服务器&#xff1a; #include<stdio.h> #include<head.h> #include<netinet/in.h> #include<sys/select.h> #include<arpa/inet.h> #define PROT 1112 #define IP "192.16…

29 | 广州美食店铺数据分析

广州美食店铺数据分析 一、数据分析项目MVP加/价值主张宣言 随着经济的快速发展以及新媒体的兴起,美食攻略、美食探店等一系列东西进入大众的眼球,而人们也会在各大平台中查找美食推荐,因此本项目做的美食店铺数据分析也是带有可行性的。首先通过对广东省的各市美食店铺数量…

对话即数据分析,网易数帆ChatBI做到了

大数据产业创新服务媒体 ——聚焦数据 改变商业 在当今数字化快速发展的时代&#xff0c;数据已经成为业务经营与管理决策的核心驱要素。无论是跨国大企业还是新兴创业公司&#xff0c;正确、迅速地洞察数据已经变得至关重要。然而&#xff0c;传统的BI工具往往对用户有一定的…

初步认识OSI/TCP/IP一(第三十八课)

1 初始OSI模型 OSI参考模型(Open Systems Interconnection Reference Model)是一个由国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的网络通信协议规范,它将网络通信分为七个不同的层次,每个层次负责不同的功能和任务。 2 网络功能 数据通信、资源共享…

MTK Android非常用分辨率修改充电动画

非标准分辨率的屏,配置MTK Android的关机充电动画. 环境 芯片 MTK 系统 Android 服务器 ubuntu 屏幕分辨率356*400,不是常见的分辨率. 原始充电动画显示异常,画面扭曲. 方法 确定使用的图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo 这个目录下…

springboot多模块打包方式

明确子父模块结构 父目录是带modules 大致结构如下&#xff1a; <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…

htmlCSS-----高级选择器

目录 前言 伪类选择器 状态类 结构类 伪元素选择器 属性选择器 前言 前面我们学习了CSS中的相关选择器&#xff08;链接html&CSS-----CSS选择器&#xff08;上&#xff09;_灰勒塔德的博客-CSDN博客 html&CSS-----CSS选择器&#xff08;下&#xff09;_灰勒塔…

计算机视觉中的Transformer

几十年来&#xff0c;理论物理学家一直在努力提出一个宏大的统一理论。通过统一&#xff0c;指的是将被认为是完全不同的两个或多个想法结合起来&#xff0c;将它们的不同方面证明为同一基础现象。一个例子是在19世纪之前&#xff0c;电和磁被看作是无关的现象&#xff0c;但电…

基于java的汽车改装方案网站设计与实现

摘要 本文主要讲述了基于SpringBootMySql开发技术开发的汽车改装方案网站的设计与实现。这里的汽车改装方案网站是通过一个平台使所有的汽车爱好者们可以不用出门就可以体验到专业的汽车改装方案设计服务。现实生活中如果需要进行汽车改装的方案设计&#xff0c;往往要跑很多次…

【大数据之Kafka】三、Kafka生产者之消息发送流程及同步异步发送API

将外部传送给过来的数据发送到kafka集群。 1 发送原理 &#xff08;1&#xff09;创建main()线程&#xff0c;创建producer对象&#xff0c;调用send方法&#xff0c;经过拦截器&#xff08;可选&#xff09;、序列化器、分区器。 &#xff08;2&#xff09;分区器将数据发送…

【Android Framework (十二) 】- 智能硬件设备开发

文章目录 前言智能硬件的定义与应用智能硬件产品开发流程智能硬件开发所涉及的技术体系概述关于主板选型主板CPU芯片的选择关于串口通信 总结 前言 针对我过往工作经历&#xff0c;曾在一家智能科技任职Android开发工程师&#xff0c;简单介绍下关于任职期间接触和开发过的一些…

DDPM: Denoising Diffusion Probabilistic Models

DDPM: Denoising Diffusion Probabilistic Models 去噪扩散模型前向过程-加噪声反向过程-去噪声 去噪扩散模型 论文题目&#xff1a;Denoising Diffusion Probabilistic Models (DDPM) 论文来源&#xff1a;NIPS, 2020 论文地址&#xff1a;https://arxiv.org/abs/2006.11239 论…

RH850从0搭建Autosar开发环境【24】- Davinci Configurator之DEM模块配置详解(上)

DEM模块配置详解 - 上 一、Autosar中DEM模块简介1.DEM对其他模块的依赖2.DEM模块架构2.1 DEM模块Dem Satellite(s) 和Master2.2 诊断事件处理2.2.1 基于计数器的算法2.2.2 基于时间的算法三、配置错误项处理3.1 容器DemEventParameter3.2 容器DemOperationCycleRef3.3 容器DemO…

13.3 目标检测和边界框

锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框&#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框 锚框的作用&#xff1a; 不用直接去预测真实框的四个坐标&#xff0c;而是&#xff1a; 1.先生成多个锚框。 2.预测每个锚框里是否含有要预测…