我正在尝试编译一个将在某个旧版本的内核上运行的C程序。我编译程序的内核与运行程序的内核版本不同。 如果我只在较新版本的内核上调用一个系统调用,程序会崩溃,还是返回一个错误值?
答案 0 :(得分:4)
这取决于。很少直接调用系统调用(syscalls (2)
手册页甚至记下了这一点);更常见的是使用诸如write
,read
,open
,close
等库包装器。如果您尝试对相关系统上不存在的系统调用使用包装函数,则包装器也可能不存在,在这种情况下,您的程序将无法通过运行时链接程序并且无法启动
另一方面,如果您通过syscall
函数直接调用系统调用(或多或少),例如
syscall(SYS_write, fd, buffer, size);
而不是
write(fd, buffer, size);
如果您尝试调用不存在的系统调用,syscall
将返回-1
,errno
将设置为ENOSYS
。
如果你使用一个足够新的libc
来包含一个内核,该内核已经足够老,不能支持相应的系统调用,那么包装函数可能会传递这个错误。检查有问题的包装函数的文档。