Linux 32位上的奇怪系统调用号

时间:2013-04-10 23:10:11

标签: linux x86 header-files x86-64 system-calls

故事

我有一个自动生成系统调用数字列表的C程序,因为我更喜欢从现实世界引用中自动生成,而不是手写的生成文件。目标是Ada包。我用经典的“Hello world”进行测试,涉及公共write系统调用...它失败了。我认为系统调用号码是错误的:64而不是4。

我从包含<asm-generic/unistd.h>的C程序生成了列表。该平台为32位,并且没有安装任何工具链目标64位平台。

unistd.h的示例定义:#define __NR_write 64(应为4),#define __NR_read 63(应为3),#define __NR_getuid 174(应为24),依此类推......

我在/usr/**的所有文件中运行了__NR_write的文本搜索,这些文件将成为预期定义的一部分,并且找不到任何人。

问题

为什么这个标题指定了奇怪的系统调用号码?为什么找不到预期的定义?这是一个新的ABI吗?

注意:该平台是Ubuntu 12.04,32位。

更新

我想出了一些运行此命令的东西:

find /usr/include/ -name "unistd*" -exec nano '{}' \;

它显示标题/usr/include/i386-linux-gnu/asm/unistd_32.h包含好的数字,并且该标题包含在/usr/include/i386-linux-gnu/asm/unistd.h中,但在包含<asm/unistd.h>时未定义许多符号。

更新2

不仅数字不同,而且名字也很多。防爆。 __NR_socket vs __NR_socketcall。解释的开始可以在可能的副本中给出:arch/x86/include/asm/unistd.h vs. include/asm-generic/unistd.h

2 个答案:

答案 0 :(得分:3)

如果你从 /usr/include/sys/syscall.h 开始(如系统调用(2)所示)并反复遵循include指令,你到达 / usr / include / ASM / unistd_32.h 。因此我建议你使用这个标题。

答案 1 :(得分:0)

来自asm-generic.h的来源:

  6 /*
  7  * This file contains the system call numbers, based on the
  8  * layout of the x86-64 architecture, which embeds the
                     ^^^^^^
  9  * pointer to the syscall in the table.
 10  *
       ...
 15  */