|
|
我的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%多。 |
|