如何以编程方式检测 linux 上是否存在系统调用?

How to detect if a syscall exists on linux programmatically?

我正在尝试编译将在某些旧版本内核上运行的 C 程序。我编译程序的内核版本与我的程序将要运行的内核版本不同。 如果我只在较新版本的内核上调用系统调用,程序会崩溃,或者 return 一个错误值吗?

这取决于。直接调用系统调用的情况很少见(syscalls (2) 手册页甚至记录了这一点);更常见的是使用 writereadopenclose 等库包装器。如果您尝试对相关系统上不存在的系统调用使用包装器函数,则包装器很可能也不存在,在这种情况下,您的程序将无法通过运行时链接器并无法启动.

另一方面,如果您直接通过 syscall 函数调用系统调用(或多或少),例如

syscall(SYS_write, fd, buffer, size);

而不是

write(fd, buffer, size);

然后 syscall 将 return -1 如果您尝试调用不存在的系统调用,并且 errno 将设置为 ENOSYS

如果您使用足够新的 libc 来包含包装函数,而内核太旧以至于不支持相应的系统调用,则包装函数可能会传递此错误。检查相关包装函数的文档。