linux 程序 减肥,程序减肥三步走
对于设计嵌入式Linux系统的研发人员来说,有一个问题是必须要考虑到的,那就是存储器的空间。我们知道嵌入式Linux系统所用的存储器不是软磁盘、硬盘、ZIP盘、CD-ROM、DVD这些众所周知的大容量常规存储器,它使用的是例如Rom, CompactFlash,M-Systems的DiskOnChip,SONY的MemoryStick,IBM的MicroDrive等体积极小,与主板上的BIOS大小相近,存储容量很小的存储器。所以怎样尽可能的节省空间就显的很重要。嵌入式系统的存储器中放置的无非是内核,文件系统,软件,以及自己开发的程序。本文就从程序入手,以一个非常简单的C程序来作为例子,通过三步来让它减肥。Hello.c:
#include
int main ()
{
printf ("hello,world");
return 0;
}我们先用正常的编译方法来编译,看看生成的程序的大小是多少#gcc –o hello hello.c
#ls –l hello
-rwxr-xr-x 1 root root 11542 Nov 13 20:07 hello从结果可以看到正常编译后的程序大小是11542Byte,现在开始我们的三步减肥,看看到底效果如何。步骤一:用gcc的代码优化参数代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。GCC提供的代码优化功能非常强大, 它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完 成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越 快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。#gcc –O2 –o hello hello.c
#ls –l hello
-rwxr-xr-x 1 root root 11534 Nov 13 20:09 hello优化过的程序的大小是11534Byte,比正常编译的结果11542Byte似乎没有小多少,不过不用着急,这才是第一步。我们接着往下进行。步骤二:用strip命令我们知道二进制的程序中包含了大量的符号信息(symbol table),有一部分是用来为gdb除错提供必要帮助的。可以通过readelf –S查看到这些符号信息。#readelf -S hello
Section Headers:
[Nr] Name Type
[ 0] NULL
[ 1] .interp PROGBITS
[ 2] .note.ABI-tag NOTE
[ 3] .hash HASH
[ 4] .dynsym DYNSYM
[ 5] .dynstr STRTAB
[ 6] .gnu.version VERSYM
[ 7] .gnu.version_r VERNEED
[ 8] .rel.dyn REL
[ 9] .rel.plt REL
[10] .init PROGBITS
[11] .plt PROGBITS
[12] .text PROGBITS
[13] .fini PROGBITS
[14] .rodata PROGBITS
[15] .eh_frame PROGBITS
[16] .data PROGBITS
[17] .dynamic DYNAMIC
[18] .ctors PROGBITS
[19] .dtors PROGBITS
[20] .jcr PROGBITS
[21] .got PROGBITS
[22] .bss NOBITS
[23] .comment PROGBITS
[24] .debug_aranges PROGBITS
[25] .debug_pubnames PROGBITS
[26] .debug_info PROGBITS
[27] .debug_abbrev PROGBITS
[28] .debug_line PROGBITS
[29] .debug_frame PROGBITS
[30] .debug_str PROGBITS
[31] .shstrtab STRTAB
[32] .symtab SYMTAB
[33] .strtab STRTAB类似于.debug_xxxx的就是用来gdb除错的。去掉它们不但不会影响程序的执行还可以减小程序的size。这里我们通过strip命令拿掉它们。#strip hello
#ls –l hello
-rwxr-xr-x 1 root root 2776 Nov 13 20:11 hello程序立刻变成2776Byte了,效果不错吧。让我们再接再厉,进行最后一步。步骤三:用objcopy命令上一步的strip命令只能拿掉一般symbol table,有些信息还是没拿掉,而这些信息对于程序的最终执行是没有什幺影响的。如:.comment; .note.ABI-tag; .gnu.version就是完全可以去掉的。所以说程序还有简化的余地,我们可以使用objcopy命令把它们抽取掉。#objcopy –R .comment –R .note.ABI-tag –R .gnu.version hello hello1
#ls –l hello1
-rwxr-xr-x 1 root root 2316 Nov 13 20:23 hello1到这一步,程序的减肥就完成了,我们可以看到程序由正常编译的11542Byte一下子渐少到2316Byte,效果非常明显。小结程序容量的减小无疑对嵌入式Linux系统的设计有着重要的意义,它为我们节省了大量空间,使得我们可以利用这部分空间来完善我们的系统,比如加大内核等等,毕竟这才是我们最终的目的。
linux 程序 减肥,程序减肥三步走相关推荐
- GitChat · 移动开发 | 小程序快速上手:三步完成小程序从无到有的开发
GitChat 作者:极笔北客 原文: 小程序快速上手:三步完成小程序从无到有的开发 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 小程序作为微信之父张小龙钦点,并多次公开为之宣传 ...
- Conexant ADSL USB 三步走猫
挺早以前放在linuxsir的 现在转过来 Conexant ADSL USB 三步走猫 关于本文 作者: 杨帆(Steven Yang) Email:yifi@tom.com AT: 青岛(Tsin ...
- 构建系统软件三步走,这些书你不可错过!
以5G.人工智能.云计算与物联网等为代表的新一轮科技革命与产业变革正在重新定义我们的信息社会.构建新型信息社会的一个关键因素是坚实的计算机基础设施,这对计算机系统能力培养提出了新的要求. 郑纬民院士在 ...
- 软件需求分析--三步走
软件项目如何进行需求分析,要解决这个问题,我们要分三步走 第一步:通过什么方式去了解需求 了解需求的方式有好几种: (1)直接与客户交谈.如果分析人员生有足球评论员的那张"大嘴", ...
- 经验分享:三步走教你升级企业NAS设备
前几年凡是对于数据存储有需求的企业都已经购买了相关的NAS产品,不过电脑和网络升级换代是比较频繁的,几年过去了中小企业对数据存储的需求也水涨船高,然而面对当初的NAS存储设备该如何处理呢?扔掉可 ...
- 搞定面试算法系列 | 分治算法三步走
戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...
- 开发经验分享_01_遇到问题三步走(思路+实战)
企业内部开发经验系列,由gblfy根据自己在公司的亲身经历总结而成,会讲述开发的思路和开发技巧,帮助更多开发人员思路明确.高效率的开发!!! 目前总结章节如下: 章节 链接 (企业内部)开发经验分享_ ...
- 施耐德电气:“三步走”实现配电数字化,制胜可持续未来
当前,工业.公共建筑和商业楼宇消耗了全世界 63%的电能,二氧化碳排放量占全球碳排放的 43%,楼宇行业的建设和运营优劣都将成为全球应对气候变化成功与否的关键.然而,这些行业中的绝大多数设施能效水平较 ...
- FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
最近在弄PowerPC平台上的spi flash的驱动程序,总体比较简单,在借鉴了U-Boot中的相关源码后,花了两周左右的时间搞定了,对于spi总线之前一直都有了解,但未能实际接触,这次在vxWor ...
- ai皮肤检测分数_智能AI皮肤检测仪三步走话术
智能 AI 皮肤检测仪三步走话术 第一步:仪器介绍 话术: 某某小姐,您好!我们现在用了是 德国进口智能 AI 皮肤检测仪 给您的皮肤做拍照 测试. 我们这台仪器是国外引起的一台专业皮肤定量分析仪器, ...
最新文章
- 【⛔拒绝内卷,学会shell,走遍天下都不怕⛔】shell编程基础
- Windows下Caffe-SSD编译
- js get/set Cookie
- Per-Title编码优化
- 关于CPU的12个硬核干货!
- 在Junit上使用Kafka
- twitter storm常用命令
- c++ 类和对象的内存管理
- 2020年日历可编辑内容模板_2020鼠年新春海报模板合集
- python微控制器编程从零开始下载_Python微控制器编程从零开始(使用MicroPython)...
- 0基础学python要多久-27岁0基础自学Python,多久可以找到工作?
- 【特征提取】基于matlab语音端点检测【含Matlab源码 552期】
- wifi智能门锁远程控制方案能实现哪些功能
- 卡巴斯基提示:“手机骷髅”病毒引发新一轮安全隐患
- 模型汇总-14 多任务学习-Multitask Learning概述
- 如何在虚拟机中安装操作系统???
- DataSource
- 基于java派大星水产商城mp4计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- 忙里偷闲第三弹:开发成绩查询微信公众号
- 为了让人愿意花3000块买口锅,这些高端厨具品牌也是蛮拼的
热门文章
- docker 部署 nacos2.x 镜像
- 计算机组成原理学习-哈工大《计算机组成原理》第四章-上篇
- 学生的认知风格类型有哪些_《认知天性》读书笔记
- python的try和except_关于python:修复try和except中的无效语法错误
- 80端口攻击_使用 ZoomEye 寻找 APT 攻击的蛛丝马迹
- hadoop namenode启动失败
- bzoj1061 志愿者招募
- iScroll示例,下拉刷新,上拉刷新
- python对象--加减重构
- maven解决“Could not calculate build plan”问题