-
-
[旧帖] [翻译]42字节可执行文件;ELF介绍;求Kx(续) 0.00雪花
-
发表于: 2012-9-22 11:57 1127
-
在使用nostartfiles之后,继续使用新的优化-nostdlib如何?
报错显示,_exit()毕竟还是一个系统调用,我们没有绕过标准库。但是,如果放弃可移植性,我们确实还是能做到不调用任何系统的函数,而顺利返回,但在那之前,我们需要了解Linux系统下,如何完成一个系统调用。
LInux系统为上层程序提供了系统调用,实现系统调用的指令是中断int 0x80。所有的系统调用都是通过这个中断实现。为了进行调用,eax需要保存调用号,其他的寄存器保存参数。如果系统调用只有一个参数,那么使用ebx寄存器,ecx,edx,esi,和edi则用于保存2,3,4,5个参数。调用返回时,eax保存返回值,如果调用失败,则eax中是一个负数。
系统调用对应的数字在文件/usr/include/asm/unistd.h。exit对应的系统调用是1,同样接受一个参数,保存在ebx中。
这样,我们不需要任何其他库函数就可以返回了。
;tiny.asm
BITS 32
GLOBAL _start
SECTION .text
_start:
mov eax,1
mov ebx,42
int 0x80
编译:
$ nasm -f elf tiny.asm
$gcc -s -nostdlib tiny.o
$./a.out; echo $?
大小为372字节。
比上一个版本小了四分之三。
(进一步的缩减,等晚上接着翻译。)
报错显示,_exit()毕竟还是一个系统调用,我们没有绕过标准库。但是,如果放弃可移植性,我们确实还是能做到不调用任何系统的函数,而顺利返回,但在那之前,我们需要了解Linux系统下,如何完成一个系统调用。
LInux系统为上层程序提供了系统调用,实现系统调用的指令是中断int 0x80。所有的系统调用都是通过这个中断实现。为了进行调用,eax需要保存调用号,其他的寄存器保存参数。如果系统调用只有一个参数,那么使用ebx寄存器,ecx,edx,esi,和edi则用于保存2,3,4,5个参数。调用返回时,eax保存返回值,如果调用失败,则eax中是一个负数。
系统调用对应的数字在文件/usr/include/asm/unistd.h。exit对应的系统调用是1,同样接受一个参数,保存在ebx中。
这样,我们不需要任何其他库函数就可以返回了。
;tiny.asm
BITS 32
GLOBAL _start
SECTION .text
_start:
mov eax,1
mov ebx,42
int 0x80
编译:
$ nasm -f elf tiny.asm
$gcc -s -nostdlib tiny.o
$./a.out; echo $?
大小为372字节。
比上一个版本小了四分之三。
(进一步的缩减,等晚上接着翻译。)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: