首页 > 解决方案 > Linux 中的 unistd_64.h

问题描述

目前,我在 x86 上使用 linux 内核 v5.8。

在我的 ubuntu 机器上,/usr/include/x86_64-linux-gnu/asm/unistd_64.h/usr/src/linux-headers-5.8.0-50-generic/arch/x86/include/generated/uapi/asm/unistd_64.h.

因此,我看不到新的系统调用,例如openat2从 linux v5.6 中添加的/usr/include/x86_64-linux-gnu/asm/unistd_64.h
(当然,我可以看到这样的系统调用/usr/src/linux-headers-5.8.0-50-generic/arch/x86/include/generated/uapi/asm/unistd_64.h。)

我认为这/usr/include/x86_64-linux-gnu/asm/unistd_64.h/usr/src/linux-headers-5.4.0-73-generic/arch/x86/include/generated/uapi/asm/unistd_64.h我使用的以前的内核版本相同。

为什么/usr/include/x86_64-linux-gnu/asm/unistd_64.h没有更新?

参考:Ubuntu 中的 unistd_64.h

标签: clinuxlinux-kernelsystem-calls

解决方案


内核提供的系统调用不必与 C 库知道的系统调用匹配。于 2020 年 4 月通过提交openat2添加到:glibce788bea

更新 Linux 5.6 的系统调用列表。

Linux 5.6 有新的 openat2 和 pidfd_getfd 系统调用。此补丁将它们添加到 syscall-names.list 并重新生成 arch-syscall.h 文件。

下一个glibc版本是2.322020 年 8 月。在 Ubuntu 中,libc6带有版本的软件包>=2.32目前仅适用于groovyhirsute

软件包 libc6

  • 仿生更新(库):GNU C 库:共享库
    2.27-3ubuntu1.4:amd64 arm64 armhf i386 ppc64el s390x
    也由:libc6-udeb 提供
  • 焦点更新(库):GNU C 库:共享库
    2.31-0ubuntu9.2:amd64 arm64 armhf i386 ppc64el s390x
    也由:libc6-udeb 提供
  • groovy (20.10) (libs): GNU C Library: Shared libraries
    2.32 -0ubuntu3: amd64 arm64 armhf i386 ppc64el s390x
    也由 libc6-udeb 提供
  • 多毛(21.04)(库):GNU C库:共享库
    2.33 -0ubuntu5:amd64 arm64 armhf i386 ppc64el s390x

glibc>=2.32但是,由于要求和无论如何都不会获得太多的可移植性linux-kernel>=5.6,因此您可以在代码中定义系统调用号 ( ifndef) 并syscall(2)改为使用。


推荐阅读