c - 让 gcc 以 "int 0x80"方式编译系统调用?

标签 c linux gcc assembly system-calls

代码在这里:

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或者至少使用 SYSENTERSYSCALL机器指令。 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/

相关文章:

C套接字编程: get IP address (IPv6 or IPv4) server bounds to, 与客户端连接到?

c - 从 Linux 内核模块写入 debugfs

c++ - 有什么方法可以加速 gcc 中的宏预处理?

c++ - 可以在 Debian Bullseye 上使用 g++ (gcc) 11 吗?

Python:如何检查由sendline执行的进程的状态

c - 为什么 GCC 说一个变量在未使用时未使用?

CS50 复数无法编译

java - JNI native 调用 *prototypes* 在他们自己的类/ namespace ?

linux - 无法在 Linux 中将 cabal 升级到最新版本

linux - icu-config 获取静态库标志