如何拆解系统调用?

时间:2011-02-09 01:38:14

标签: linux gdb system-calls disassembly

我如何反汇编系统调用,以便我可以获得其中涉及的汇编指令

3 个答案:

答案 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寻址。