各种小巧的Hello World

在Reddit看到这篇文章:Hello from a libc-free world! ,觉得挺有趣,然后又想起以前看过的各种相关资料,在此做一个整理。注意所有实验环境都为Linux。

版本一:

实际上是用汇编重写_start入口,具体说明请看文章开头提供的连接,汇编代码如下,命名为stubstart.S

[cpp] view plaincopy

  1. _start:
  2. call main
  3. movl $1, %eax
  4. xorl %ebx, %ebx
  5. int $0x80
然后与普通hello.c连接(hello.c)的代码我就不用写出来了吧。。命令如下:
gcc -nostdlib stubstart.S -o hello hello.c
OK,一个不需要libc的helloworld程序就完成了。只是简单的跳过了_start的各种初始化

版本二:

与版本一其实差不多,只是用shellcode来完成了,代码如下

[cpp] view plaincopy

  1. typedef int (*sc_fun)(int,int,int,int,int,int,int);
  2. void _start(void) {
  3. char syscall[] = "/x60/x83/xc4/x24/x58/x5b/x59/x5a/x5e/x5f/x5d/xcd/x80/x83/xec/x40/x61/xc3";
  4. ((sc_fun)syscall)(4, 0, "Hello, World/n", 13, 0, 0, 0);
  5. ((sc_fun)syscall)(1, 0, 0, 0, 0, 0, 0);
  6. }

连接命令如下:
gcc -o nostdlib hello.c -m32 -z execstack –nostdlib
嗯,完成了,也是-nostdlib,至于shellcode调用的是什么系统函数,我猜是write吧:)

版本三:

[cpp] view plaincopy

  1. char *str = "Hello world!/n";
  2. void print()
  3. {
  4. asm( "movl $13, %%edx /n/t"
  5. "movl %0, %%ecx /n/t"
  6. "movl $0, %%ebx /n/t"
  7. "movl $4, %%eax /n/t"
  8. "int $0x80 /n/t"
  9. :: "r"(str):"edx","ecx","ebx");
  10. }
  11. void exit()
  12. {
  13. asm( "movl $42,%ebx /n/t"
  14. "movl $1,%eax /n/t"
  15. "int $0x80 /n/t");
  16. }
  17. void nomain()
  18. {
  19. print();
  20. exit();
  21. }

关于gcc内联汇编,可参考下相关书籍,代码大概意思是nomain()是入口,然后调用print()函数,打印"Hello world”,接着调用exit()函数,结束进程。这里的print函数使用了Linux的WRITE系统调用,exit使用了EXIT系统调用,都是用内联汇编实现。

连接命令如下:

gcc –c hello.c

ld –static –e nomain –o hello hello.o

注意,这里控制了连接器的行为,用-e指定了入口函数为nomain

版本四:

接着版本三,我们用objdump来查看hello,会发现他有四个段:.text .rodata .data .comment。

那么可不可以把他们都合并到一个段里面,该段的属性是可执行,可读的,包含程序的数据和指令? 可以的,此时需要使用ld连接脚本创建脚本hello.lds如下:

[c-sharp] view plaincopy

  1. ENTRY(nomain)
  2. SECTIONS
  3. {
  4. . = 0x804800 + SIZEOF_HEADERS;
  5. tinytext : { *(.text) *(.data) *(.rodata) }
  6. /DISCARD/ : { *(.comment) }
  7. }

这是很简单的连接脚本,就是设置当前位置0x804800 + SIZEOF_HEADERS,后面紧跟着tinytext段,没有其他段了。使用入下命令连接

gcc –c  hello.c

ld –static – T hello.lds –o hello hello.o

OK,一个更小巧的HelloWorld完成了。

版本五:

版本四是最小的了吗?差远了。。。早就有人专门研究过最小的可执行文件了,从ELF文件的各个字节下手。。点这里:Size Is Everything 。。很牛B,很geek的东西。。理论上那就是最小的可执行文件了。

以上各个版本的helloworld大小,自己生成后用wc –c hello看吧:)。再配合objdump能学到更多~

时间: 2025-01-10 16:11:57

各种小巧的Hello World的相关文章

Team Project Proposal: 小巧方便的,具有同步功能的To Do List小程序(没取名=。=) By Xufang Luo

现在市面上有很多关于待办提醒事项的小程序,我们常用的Outlook里面就集成了增加待办事项的功能,很多手机上自带的日历也有代办事项的功能.以上这些软件大多需要几个步骤来完成想要做的事情,但是实际上,有时候我们需要一个更加小巧的,更加方便的软件,来记录一闪而过的灵感,以及很容易忘记的事情.这就是我提出开发一个方便的,具有同步功能的To Do List小程序的缘由. 基本功能: 可登陆多个账户,实现事项在日历中同步.有了同步功能之后,事项只跟账户相关,登陆账户即可查看事项. 支持2种输入方式: 传统

【转】推荐介绍几款小巧的Web Server程序

原博地址:http://blog.csdn.net/heiyeshuwu/article/details/1753900 偶然看到几个小巧有趣的Web Server程序,觉得有必要拿来分享一下,让大家除了知道Apache.IIS之外,原来还有更多有趣的选择.主要介绍了:micro_httpd.mini_httpd.thttpd.lighttpd.shttpd 等无款小巧好用的httpd. [ micro_httpd - really small HTTP server] 特点:* 支持安全的 .

QT绘图技术(二)QCustomPlot - 超强超小巧的qt绘图控件

QCustomPlot - 超强超小巧的qt绘图控件 2016-10-22 16:03:25|  分类: QT| 官方网站:http://www.qcustomplot.com/ 1.0下载地址:http://download.csdn.net/detail/czyt1988/5986701 下载LOFTER我的照片书  | QCustomPlot 超强超小巧的qt绘图控件,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp即可使用,远比qwt方便,若只

小巧数据库 Derby 使用攻略

阅读目录 1. Derby 介绍 2. 稍稍配置下环境变量 3. Derby 操作和 Java 访问 回到顶部 1. Derby 介绍 将目光放在小 Derby 的原因是纯绿色.轻巧.内存占用小,分分钟在你机子跑起来,自己做点需要连接数据库的代码实践非常方便. 虽然 Mysql 也可以,多一种选择,不是也挺好么? Apache Derby是一个完全用 java 编写的数据库,Derby是一个Open source的产品. Apache Derby非常小巧,核心部分derby.jar只有2M,既可

iOS开发一款小巧简洁的日历控件

iOS开发一款小巧简洁的日历控件 一.引言 日 历是iOS开发中有时会用到的一个UI控件,网上开源的代码也很多,我浏览过一些,大致有两种模式,一种是日历的逻辑由开发者自己实现,通过计算闰年与平 年来确定月份天数,另外一种模式是通过NSDate这个时间类,来获取日历的信息.我个人认为后一种更加安全,代码性能也会更加优质,下面就是我用这种模 式实现的一个日历控件. 二.设计思路 1.先来看下效果吧                    2.我们需要实现的功能 (1)每行7天,对应星期,列数为将当前月

小巧单据打印管理软件

A.软件名称 小巧票据打印管理软件 B.软件版本  v3.1 C.软件大小  24mb D.软件所需系统要求 win all E.软件是否免费 试用50次 F.软件下载地址 http://www.vtitsoft.net/download/xiaoqiaopiaoju.rar G.软件截图http://www.vtitsoft.net/1.jpg H.PC端:64*64 移动端:http://www.vtitsoft.net/64.jpg 150*150 PNG格式LOGO文件(重要) http

Mac软件分享:上小巧实用的GIF格式录屏软件 LICEcap

很多时候,作为程序猿,你将不只是一名程序猿,你得会十八般武艺才能笑傲江湖,东方不败.哈哈!!! 美工有事请假了,我要临时上岗,打开PS,各种截图.产品请假了,或许我得临时给自己套上产品助理的角色,为刚才遇到的一个产品逻辑问题好好梳理一番,然后理出合理的产品体验,然后便是敲敲敲code了. 其实,不只是程序猿,作为其他任何一个岗位的从业者,我们都可能不止会一门技术,其他的领域都或多或少接触.了解甚至深入学习. 扯,扯,扯远了... 由于自己语言表达能力不佳或者说不愿意把一件很简单的事情通过一连串复

小巧灵活语言LUA小开篇

哇塞,第一篇博客,感觉好紧张啊.之前用c++来写cocos,后来了解到用脚本来写更加便于后期维护更新.最近便开始琢磨这个小脚本lua,lua语言封装的很小巧也很灵活,代码格式也是很简单并不像c++java那样严格.首先呢便是这个编译环境的搭配.<lua官网:http://www.lua.org/> 上面便是最新版的5.3.1下载包,我们将其下载解压.可以看到src目录下存在很多.c和.h文件,然后我们新建一个vs2012工程,将所有的文件导入生成.然后我们会得到一个lua 和luac的exe可

JQUERY实现的小巧简洁的无限级树形菜单

JQUERY实现的小巧简洁的无限级树形菜单,可用于后台或前台侧栏菜单!兼容性也比较好. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <