glibc 中的 __NR_-prefixed 符号是什么?

What are the __NR_-prefixed symbols in glibc?

我正在尝试编译 Box86 on Alpine Linux, a Linux distribution which uses the musl libc implementation rather than glibc。在完成 46% 时,编译停止并出现以下错误:

/home/newbyte/box86/src/emu/x86syscall.c:124:11: error: '__NR_gettimeofday' undeclared here (not in a function); did you mean 'gettimeofday'?
  124 |     { 78, __NR_gettimeofday, 2 },
      |           ^~~~~~~~~~~~~~~~~
      |           gettimeofday
/home/newbyte/box86/src/emu/x86syscall.c:210:12: error: '__NR_clock_gettime' undeclared here (not in a function); did you mean 'clock_gettime'?
  210 |     { 265, __NR_clock_gettime, 2 },
      |            ^~~~~~~~~~~~~~~~~~
      |            clock_gettime
/home/newbyte/box86/src/emu/x86syscall.c:211:12: error: '__NR_clock_getres' undeclared here (not in a function); did you mean 'clock_getres'?
  211 |     { 266, __NR_clock_getres, 2 },
      |            ^~~~~~~~~~~~~~~~~
      |            clock_getres

当然,我的第一直觉是查找这些名称并弄清楚它们的用途,以便我可以找到合适的替代品,但我运气不佳,这让我想到了我的问题:这些是什么__NR_-前缀符号,它们有什么作用?

__NR_ 开头的标识符是 non-portable、Linux-kernel-specific 定义系统调用号的常量名称。用户 space 程序应使用的可移植名称以 SYS_ 开头。

GNU libc 允许 non-portable 名称从内核头文件传递到 <sys/syscall.h>;听起来 musl libc 没有。尝试 search-and-replace 将整个文件中的 __NR_ 更改为 SYS_

您似乎正在使用 musl 1.2.0 或更高版本进行编译,即使在 32 位目标上也有 64 位 time_t。这意味着 32 位系统调用(gettimeofdayclock_gettimeclock_getres)与 musl 对 struct timevalstruct timespec 的定义不兼容。为了防止意外调用那些类型错误的系统调用,相应的系统调用常量在此环境中不可用。