获取程序链接是很容易的部分:
更改_start
到start
$ nasm -f macho exit.asm
$ ld -arch i386 -o exiter exit.o
问题是,exit.asm
呼吁在i386的Linux exit()
系统调用(EAX = 1),程序将不按预期在OS X与零个状态退出
一个系统调用是内核的请求.与之exit()
不同sqrt()
,它必须向其实现中具有更高权限的软件组件发出请求,因为它终止正在运行的程序.应用无法自行创建或终止进程.系统调用为应用程序提供了一种让内核代表他们执行操作的方法.
制作系统调用是这样的:
应用程序通过将数据放入CPU寄存器(或寄存器指向的存储器)来描述他们想要执行的操作,例如
该值1
在EAX是系统调用号exit
.
该值0
在EBX(EBX被清零xor
)是第一个参数到系统调用,退出状态.
应用程序发出一条指令,使控件转移到内核,例如
int 80
在i386上
sycall
在x86-64上
svc
在ARMv7上的Thumb模式下
内核检查请求并决定执行或拒绝它.
内核将控制权转移回app,返回值在商定的位置,例如i386上的EAX.
Linux和OS X都void exit(int)
为C程序提供了一个函数,但是没有就如何向内核描述这个请求的细节达成一致.代码exit.asm
与_exit()
函数的实现处于同一级别libc
.
即使在运行Linux的不同体系结构之间,系统调用号和调用约定也不同.例如,在x86-64 Linux上,exit(0)
更常见的是这样发出:
xor rdi, rdi mov al, 60 syscall
您可以通过拆解看到这个_exit
在/lib64/libc.so.6
.
您可以.但你必须将程序与libc
.链接exit.asm
上面的区别是:
$ cc -m32 -nostdlib exit.o -o exiter
和
出口libc.asm
extern exit global main main: push 0 call exit
必须与以下内容联系:
$ cc -m32 exit-libc.o -o exit-libc
试试这个,看一下文件大小.
获取程序链接是很容易的部分:
更改_start
到start
$ nasm -f macho exit.asm
$ ld -arch i386 -o exiter exit.o
问题是,exit.asm
呼吁在i386的Linux exit()
系统调用(EAX = 1),程序将不按预期在OS X与零个状态退出
一个系统调用是内核的请求.与之exit()
不同sqrt()
,它必须向其实现中具有更高权限的软件组件发出请求,因为它终止正在运行的程序.应用无法自行创建或终止进程.系统调用为应用程序提供了一种让内核代表他们执行操作的方法.
制作系统调用是这样的:
应用程序通过将数据放入CPU寄存器(或寄存器指向的存储器)来描述他们想要执行的操作,例如
该值1
在EAX是系统调用号exit
.
该值0
在EBX(EBX被清零xor
)是第一个参数到系统调用,退出状态.
应用程序发出一条指令,使控件转移到内核,例如
int 80
在i386上
sycall
在x86-64上
svc
在ARMv7上的Thumb模式下
内核检查请求并决定执行或拒绝它.
内核将控制权转移回app,返回值在商定的位置,例如i386上的EAX.
Linux和OS X都void exit(int)
为C程序提供了一个函数,但是没有就如何向内核描述这个请求的细节达成一致.代码exit.asm
与_exit()
函数的实现处于同一级别libc
.
即使在运行Linux的不同体系结构之间,系统调用号和调用约定也不同.例如,在x86-64 Linux上,exit(0)
更常见的是这样发出:
xor rdi, rdi mov al, 60 syscall
您可以通过拆解看到这个_exit
在/lib64/libc.so.6
.
您可以.但你必须将程序与libc
.链接exit.asm
上面的区别是:
$ cc -m32 -nostdlib exit.o -o exiter
和
出口libc.asm
extern exit global main main: push 0 call exit
必须与以下内容联系:
$ cc -m32 exit-libc.o -o exit-libc
试试这个,看一下文件大小.