【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.pswp.cn/news/38864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38864.shtml
英文地址,請注明出處:http://en.pswp.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.預測每個錨框里是否含有要預測…