LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 838|回复: 0

怎样把int main(){return 10;}转换为汇编,大大减少可执行文件体积

[复制链接]
发表于 2006-7-27 16:46:48 | 显示全部楼层 |阅读模式
我的gcc版本是3.3.5
如果我们有个文件,命名为test.c,内容是
int main(){return 10;}
用光gcc编译之
gcc -s test.c
生成的a.out大小是2826字节,比较大。因为需要连接main和exit,文件比较大,而我们其实并不需要main以及exit,我们安装nasm来用汇编来解决它。
wajig install nasm
写以下的汇编到test.asm
  ; test.asm
  BITS 32
  GLOBAL _start
  SECTION .text
  _start:
                mov     eax, 1
                mov     ebx, 10  
                int     0x80

这里简单介绍一下为什么这么写,_start是用来给连接器指明进程入口点的。
mov eax,1 是用来设置系统调用号的,1对应的就是exit,在asm/unistd.h文件中有定义,可以参考。
mov ebx,10是传入给系统调用的参数,这个例子只有一个参数,如果有多个还可以按照顺序使用ecx,edx,esi,edi。
int 0x80表示引起中断,这个中断的结果就是CPU响应该中断,执行该系统调用。
编译,运行之
nasm -f elf test.asm
gcc -s -nostartfiles test.o
看一下a.out的大小,只有932个字节,缩小了50%还不止呢。

如果连接的时候加上-nostdlib选项后,发现a.out只有404字节了,又缩小了50%多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表