我正在使用这个https://github.com/openjudge/sandbox项目来控制我在服务器上的程序执行。除了我无法理解示例代码的一部分如何工作之外,我几乎完成了所有工作。部分是:
int16_t abi32(int scno)
{
assert((scno >= 0) && (scno < 1024));
#ifdef __x86_64__
return (int16_t)(scno | (1 << 10));
#else /* __i386__ */
return (int16_t)(scno);
#endif /* __x86_64__ */
}
...
const int16_t sc_safe[] =
{
abi32(0), abi32(3), abi32(4), abi32(19), abi32(45), abi32(54),
abi32(90), abi32(91), abi32(122), abi32(125), abi32(140), abi32(163),
abi32(192), abi32(197), abi32(224), abi32(243), abi32(252),
#ifdef __x86_64__
0, 1, 5, 8, 9, 10, 11, 12, 16, 25, 63, 158, 219, 231,
#endif /* __x86_64__ */
-1, /* sentinel */
};
...
sc_safe数组是系统调用的白名单,因为它们在操作系统类型之间有所不同,所以有宏#ifdef x86_64 。但是为什么#else分支中没有32位系统调用,为什么它应该适用于64位操作系统,如果32位系统调用%eax增加1024?是否忽略了这种方式?