我如何反汇编系统调用,以便我可以获得其中涉及的汇编指令
答案 0 :(得分:4)
嗯,你可以这样做。说我想得到一个“dup”的汇编转储:
写下这个:
#include <stdio.h>
#include <sys/file.h>
int main() {
return dup(0)
}
编译:
gcc -o systest -g3 -O0 systest.c
转储它:
objdump -d systest
查看“主要”我看到:
400478: 55 push %rbp
400479: 48 89 e5 mov %rsp,%rbp
40047c: bf 00 00 00 00 mov $0x0,%edi
400481: b8 00 00 00 00 mov $0x0,%eax
400486: e8 1d ff ff ff callq 4003a8 <dup@plt>
40048b: c9 leaveq
40048c: c3 retq
40048d: 90 nop
40048e: 90 nop
40048f: 90 nop
所以看看“dup @ plt”我看到了:
00000000004003a8 <dup@plt>:
4003a8: ff 25 7a 04 20 00 jmpq *2098298(%rip) # 600828 <_GLOBAL_OFFSET_TABLE_+0x20>
4003ae: 68 01 00 00 00 pushq $0x1
4003b3: e9 d0 ff ff ff jmpq 400388 <_init+0x18>
所以它正在调用一个“全局偏移表”,我假设它具有所有的系统调用向量。就像其他帖子所说,请参阅内核源代码(或标准库源代码?)以获取相关详细信息。
答案 1 :(得分:2)
我认为你不想这样做。系统调用处理很复杂(参见http://www.ibm.com/developerworks/linux/library/l-system-calls/)。由于您已使用“linux”标记了此问题,因此您只需从kernel.org下载源代码(这将比汇编代码更容易理解和提供信息)。
答案 2 :(得分:0)
要了解linux系统调用,请浏览代码。
重要文件是:
/include/linux/syscalls.h(linux中支持的所有系统调用)
/arch/arm/kernel/entry-common.S(在注册级别执行系统调用)
/arch/arm/kernel/calls.S(系统电话号码)
/arch/arm/include/asm/unistd.h(系统调用的地址)
注意:系统调用表只能从system.map寻址。