代码在这里:
void main()
{
_exit(0);
}
通过拆卸主要部分:
80483d4: 55 push %ebp
80483d5: 89 e5 mov %esp,%ebp
80483d7: 83 e4 f0 and $0xfffffff0,%esp
80483da: 83 ec 10 sub $0x10,%esp
80483dd: c7 04 24 00 00 00 00 movl $0x0,(%esp)
80483e4: e8 17 ff ff ff call 8048300 <_exit@plt>
据我所知,进行系统调用的方法是使用“int 0x80”,但我只能在这里找到“call 8048300 exit@plt”,所以我如何更改 gcc 以让它在“int 0x80”中编译系统调用方式(我需要我的程序以这种方式调用系统调用)?
最佳答案
你应该用 gcc -Wall
编译(也许还有 -g
标志)。
这会给你更多的警告,并指出一些容易犯的错误,比如缺少适当的 #include
exit(3) function 是一个库函数(使 atexit
成为可能)。对应的系统调用是_exit(2) , 但在最近的 Linux 上 exit
正在调用 exit_group(2) .所以你的例子错过了 #include <stdlib.h>
当前的 Linux 实现通常不使用 int 0x80
但是通过 VDSO或者至少使用 SYSENTER
或 SYSCALL
机器指令。 YMMV.
你可以,因为Jeremy answered , 使用 asm
; (您可以为您正在使用的所有系统调用定义自己的 header ,并让这些系统调用成为 static inline
函数来执行一些 asm
)请注意,对于其他系统调用,您想要捕获它们的失败和 errno
错误代码。
你为什么要问?.... libc(及其启动例程 crt0.o
...)正在使用复杂的技巧来调用 main
...
另见 this answer
关于c - 让 gcc 以 "int 0x80"方式编译系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15654175/