我有一个自动生成系统调用数字列表的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>
时未定义许多符号。
不仅数字不同,而且名字也很多。防爆。 __NR_socket
vs __NR_socketcall
。解释的开始可以在可能的副本中给出:arch/x86/include/asm/unistd.h vs. include/asm-generic/unistd.h。
答案 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 */