转自:http://calamaryshop.blogspot.com/2011/11/linux-strip-objcopy.html

對於設計嵌入式Linux系統的研發人員來說,記憶體的空間是非常斤斤計較的。
嵌入式Linux系統所用的記憶體不是軟碟、硬碟、ZIP 盤、CD-ROM、DVD這些大容量記憶裝置,而是使用的是Rom,Flash,
CompactFlash,
SD...等體積極小,與主板上的BIOS大小相近,存儲容量很小的記憶體。所以怎樣盡可能的節省空間就顯的很重要。嵌入式系統的記憶體中放置的是
Linux核心,文件系統,軟體,以及自己開發的程式。
以一個簡單的C程式來做例子,讓它減肥。
HelloWorld.c:
#include
int main()
{
        printf("Hello, World1.\n");
        printf("Hello, World2.\n");
        printf("Hello, World3.\n");
        return 0;
}
先用正常的編譯方法編譯,看看生成的程式的大小是多少
~#gcc –o HelloWorld HelloWorld.c
~# ls HelloWorld -al
-rwxr-xr-x 1 root root 7144 2011-11-25 11:23 HelloWorld
從結果可以看到正常編譯後的程式大小是 7144Byte

1. 用 strip 命令

二進位程式中包含了大量的符號資訊(symbol table),有一部分是用來gdb除錯提供必要幫助的。可以通過 readelf –S 查看到這些符號資訊。
~# readelf -S HelloWorld
There are 30 section headers, starting at offset 0x1128:
Section Headers:
  [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
  [ 0] NULL 00000000 000000 000000 00 0 0 0
  [ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1
  [ 2] .note.ABI-tag NOTE 08048148 000148 000020 00 A 0 0 4
  [ 3] .note.gnu.build-i NOTE 08048168 000168 000024 00 A 0 0 4
  [ 4] .hash HASH 0804818c 00018c 000028 04 A 6 0 4
  [ 5] .gnu.hash GNU_HASH 080481b4 0001b4 000020 04 A 6 0 4
  [ 6] .dynsym DYNSYM 080481d4 0001d4 000050 10 A 7 1 4
  [ 7] .dynstr STRTAB 08048224 000224 00004a 00 A 0 0 1
  [ 8] .gnu.version VERSYM 0804826e 00026e 00000a 02 A 6 0 2
  [ 9] .gnu.version_r VERNEED 08048278 000278 000020 00 A 7 1 4
  [10] .rel.dyn REL 08048298 000298 000008 08 A 6 0 4
  [11] .rel.plt REL 080482a0 0002a0 000018 08 A 6 13 4
  [12] .init PROGBITS 080482b8 0002b8 000030 00 AX 0 0 4
  [13] .plt PROGBITS 080482e8 0002e8 000040 04 AX 0 0 4
  [14] .text PROGBITS 08048330 000330 00018c 00 AX 0 0 16
  [15] .fini PROGBITS 080484bc 0004bc 00001c 00 AX 0 0 4
  [16] .rodata PROGBITS 080484d8 0004d8 000035 00 A 0 0 4
  [17] .eh_frame PROGBITS 08048510 000510 000004 00 A 0 0 4
  [18] .ctors PROGBITS 08049f0c 000f0c 000008 00 WA 0 0 4
  [19] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4
  [20] .jcr PROGBITS 08049f1c 000f1c 000004 00 WA 0 0 4
  [21] .dynamic DYNAMIC 08049f20 000f20 0000d0 08 WA 7 0 4
  [22] .got PROGBITS 08049ff0 000ff0 000004 04 WA 0 0 4
  [23] .got.plt PROGBITS 08049ff4 000ff4 000018 04 WA 0 0 4
  [24] .data PROGBITS 0804a00c 00100c 000008 00 WA 0 0 4
  [25] .bss NOBITS 0804a014 001014 000008 00 WA 0 0 4
  [26] .comment PROGBITS 00000000 001014 000023 01 MS 0 0 1
  [27] .shstrtab STRTAB 00000000 001037 0000ee 00 0 0 1
  [28] .symtab SYMTAB 00000000 0015d8 000410 10 29 45 4
  [29] .strtab STRTAB 00000000 0019e8 000200 00 0 0 1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
以減小程式的 size。這裏我們用 strip 命令拿掉它們。
~# cp HelloWorld HelloWorld_org
~# strip HelloWorld
~# ll
total 28
drwxr-xr-x 2 root root 4096 2011-11-25 12:01 ./
drwxr-xr-x 19 root root 4096 2011-11-25 11:20 ../
-rwxr-xr-x 1 root root 5496 2011-11-25 12:01 HelloWorld*
-rw-r--r-- 1 root root 156 2011-11-25 11:56 HelloWorld.c
-rwxr-xr-x 1 root root 7144 2011-11-25 12:01 HelloWorld_org*
程式立刻變成 5496Byte了,效果不錯。

2. 用 objcopy 命令
還有什麼是可以拿掉的呢?上一步的 strip 命令只能拿掉一般 symbol
table,有些資訊還是沒拿掉,而這些資訊對於程式的最終執行是沒有什麼影響的。如:.comment; .note.ABI-tag;
.gnu.version 就是完全可以去掉的。所以說程式還有簡化的餘地,我們可以使用 objcopy 命令把它們抽取掉。
~# objcopy -R .comment -R .note.ABI-tag -R .gnu.version HelloWorld HelloWorld_obj
~# ll
total 52
drwxr-xr-x 2 root root 4096 2011-11-25 13:17 ./
drwxr-xr-x 19 root root 4096 2011-11-25 11:20 ../
-rwxr-xr-x 1 root root 5496 2011-11-25 13:15 HelloWorld*
-rw-r--r-- 1 root root 156 2011-11-25 11:56 HelloWorld.c
-rwxr-xr-x 1 root root 5304 2011-11-25 13:17 HelloWorld_obj*
-rwxr-xr-x 1 root root 7144 2011-11-25 12:01 HelloWorld_org*
-rwxr-xr-x 1 root root 5496 2011-11-25 12:02 HelloWorld_strip*
查看一下 HelloWorld_obj為5304Bytes,又少了一點。

比較一下原始bin,strip後的bin,objcopy後的bin:
-rwxr-xr-x 1 root root 7144 2011-11-25 12:01 HelloWorld_org*
-rwxr-xr-x 1 root root 5496 2011-11-25 12:02 HelloWorld_strip*
-rwxr-xr-x 1 root root 5304 2011-11-25 13:17 HelloWorld_obj*
程式容量的減小對嵌入式 Linux系統的設計很有意義,節省了大量空間,使得我們可以利用這部分空間來完善我們的系統,如可再加大Linux核心等等。

Linux 程式減肥(strip & objcopy)(转载)的更多相关文章

  1. linux进程地址空间详解(转载)

    linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...

  2. Linux下高cpu解决方案(转载)

    Linux下高cpu解决方案(转载 1.用top命令查看哪个进程占用CPU高gateway网关进程14094占用CPU高达891%,这个数值是进程内各个线程占用CPU的累加值.   PID USER  ...

  3. 祝贺 Linux 25 岁:25 个关于 Linux 的惊人真相!【转载】

    作者:Javen Fang链接:https://zhuanlan.zhihu.com/p/22222383来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 25 年前的这 ...

  4. Linux下不同服务器间数据传输--转载

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  5. Linux文件操作学习总结【转载】

    本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951 文件类型:普通文件(文本文件,二进制文件).目录文件.链接文件.设备 ...

  6. Linux常用Shell脚本珍藏【转载】

    我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本.如何学好脚本,最关键的 ...

  7. Linux top和负载的解释(转载)

    转载自://www.blogjava.net/freeman1984/archive/2011/12/08/365853.html op命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程 ...

  8. Linux学习笔记—Linux磁盘与文件系统管理(转载)

    认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...

  9. CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境【转载】

    本文转载自 园友David_Tang的博客,如有侵权请联系本人及时删除,原文地址: http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.h ...

随机推荐

  1. net上传文件的三种方法

    ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...

  2. 借助nodejs解析加密字符串 node安装库较python方便

    const node_modules_path = '../node_modules/' // crypto-js - npm https://www.npmjs.com/package/crypto ...

  3. QQ登录集成到自己网站php代码(转载)

    我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考. 1.打开open.qq.com 添加创 ...

  4. 【zabbix】微信告警消息模版

    下面给出了一个zabbix微信告警消息的模版, 消息最后加上#号和短横线的设计有两个原因: 1,zabbix的微信告警消息总是被截断,比如最后一个告警时间,如果没有最后一行#号,在微信上看的时候时间不 ...

  5. [2018-11-03]2018年10月28日宁波dotnet社区活动回顾及下次活动预告

    离上次活动,有半年了,汗.之后尽量保证每月一次,以组织为主,多邀请嘉宾来分享. 本次活动不足之处 人手不足:由于活动组织事项受限于人手(目前就我一个,这次活动前后我又应邀给大红鹰学院应届生介绍dotn ...

  6. 51Nod 1486 大大走格子 —— 组合数学

    题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  7. C# 关于线程锁lock的使用方法

    C# 关于线程锁lock的使用方法 原创 2016年09月02日 10:07:05 标签: c# / 线程 / 锁 / lock 11937 在多线程编程中,可能会有许多线程并发的执行一段代码(代码块 ...

  8. TCP/IP协议数据包文件PCAP分析器

    一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PC ...

  9. UTCformat 转换UTC时间并格式化成本地时间

    /** * UTCformat 转换UTC时间并格式化成本地时间 * @param {string} utc */ UTCformat (utc) { var date = new Date(utc) ...

  10. 分享知识-快乐自己:论 Mybatis中的关联关系(一对多,多对一,多对多)

    论:一对多:(举例一个省有多个市)就是实体类中有(市)类型集合属性:多对一:(多个市有一个共同的省)就是类中有(省)类型的属性.下面来介绍:一对一.多对一的使用方式. 一对多方: package ml ...