`
dawuafang
  • 浏览: 1108186 次
文章分类
社区版块
存档分类
最新评论

少年,你的一个Hello World 有多小?

 
阅读更多

起因如上……


额,先把平台放一下,因为有些代码设计系统架构,如果你是x86 的架构需要自己修改代码:




首先是平时调用glibc 的C 程序:

#include <stdio.h>

int
main (void) {
        printf ("Hello World!\n");
        return 0;
}
看一下大小,哇,足足有将近7KB:



阶段1:在平时的基础上使用strip

恩不错,还剩4K 多一点:



阶段2:不使用glibc 并且strip

哇!只剩下520B 了有木有!直接调用系统调用竟然把可执行文件的体积缩小了这么多!

.section        .data
aStr: .ascii "Hello World!\n"
aStrEnd:

.section        .text
.global _start
_start:
        movq    $1, %rdi
        movq    $aStr, %rsi
        movq    $(aStrEnd-aStr), %rdx
        movq    $1, %rax
        syscall

        movq    $0, %rdi
        movq    $60, %rax
        syscall



阶段3:克勤克俭用指令体积

我们应该尽量减少指令编译后形成机器码的体积,尽量使之最小!

哇!通过精心的挑选指令,ELF 文件体积减小到了496 B:

.section        .data
aStr: .ascii "Hello World!\n"
aStrEnd:

.section        .text
.global _start
_start:
        movw    $1, %di
        movl    $aStr, %esi
        movb    $(aStrEnd-aStr), %dl
        movb    $1, %al
        syscall

        xor     %di, %di
        movb    $60, %al
        syscall



阶段4:不再使用段

就是这样,喵,当然strip 还是要的,看看怎么样,哇,新的记录368 字节:

aStr: .ascii "Hello World!\n"
aStrEnd:

.global _start
_start:
        movw    $1, %di
        movl    $aStr, %esi
        movb    $(aStrEnd-aStr), %dl
        movb    $1, %al
        syscall

        xor     %di, %di
        movb    $60, %al
        syscall



阶段5:目标文件中“没用”的东西统统扔掉!

上面分别使用syscall 代替了glibc,调整了指令的大小,并且去掉了分段,接下来在这个基础上对ELF 下手吧!

先看看有用的东西(ELF 头、程序头和节头)有多少,64+56+64 = 184B:

只留下这184B,剩下的统统不要了!


最后的到了什么?瞧!一个不到200 字节的Hello World!让我们掐去脑袋,它可以给你提供……



分享到:
评论

相关推荐

    Django-HelloWorld

    Django-HelloWorld

    少年练剑:小程序学习笔记:HelloWorld,json配置项,视图容器

    一:HelloWorld 准备工作 开发工具安装好后,新建一个项目,记得取消勾选“创建quick start项目” (此图片来源于网络,如有侵权,请联系删除! )   从Hello,World!开始 了解下目录结构 小程序 = app程序主体 + ...

    NCT-Python编程一级-模拟卷1(含答案).pdf

    Python⼀级模拟卷(⼀) NCT全国⻘少年编程能⼒等级测试 Python语⾔编程⼀级模拟卷 (卷⾯分值:100 分,考试时间:60 分钟) 姓名____________________ 准考证号____________________ ⼀、单项选择题(每题3分,共...

    自己动手写操作系统(含源代码).part2

    换言之,如果你已经对实现一个操作系统有了一定的经验,那么这本书可能不适合你。这本书适合从来没有编写过操作系统的初学者。 本书的排版是我用L ATEX自己完成的。在排版中我花了一些工夫,因为我希望读者购买的...

    自己动手写操作系统(含源代码).part1

    换言之,如果你已经对实现一个操作系统有了一定的经验,那么这本书可能不适合你。这本书适合从来没有编写过操作系统的初学者。 本书的排版是我用L ATEX自己完成的。在排版中我花了一些工夫,因为我希望读者购买的...

    springMVC微信公众号接入实例

    springMVC微信公众号接入实例,整合之后可以直接运行,不过要把2个id换成自己的,希望对刚做微信开发的小伙伴有帮助

    父与子的编程之旅

    有些人认为没用,因为在这个浮躁的当下,程序员已经沦为IT民工;还有些人觉得家长功利,以为是受新闻里那些少年出名的低龄程序员和黑客的影响。 先说功利。我是在非常严格的家庭中成长起来的,一路出类拔萃的 成绩...

    freemarker总结

    上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:...

    MSP430x1xx Family User's Guide.pdf

    当我在很小的时候,一直期望从事制造出电脑、手机之类的高端工作,然我的梦想实现之后,却期望着在浩瀚无垠的草原上沐浴春风,在美丽的夜空下遥望星空,感受大自然的花香鸟语,事实永远和我们期望的永远不一样,就连...

Global site tag (gtag.js) - Google Analytics