glibc中带有__NR_前缀的符号是什么?

问题描述

我正在尝试在Alpine Linux上编译Box86,该Linux发行版使用musl libc实现而不是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,|            ^~~~~~~~~~~~~~~~~~
      |            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,|            ^~~~~~~~~~~~~~~~~
      |            clock_getres

自然地,我的第一个直觉是查找这些名称并弄清楚它们的用途,以便我可以找到合适的替代品,但是我倒霉,这引出我的问题:这些{{ 1}}前缀的符号,它们的作用是什么?

解决方法

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

,

__NR_开头的标识符是不可移植的,Linux内核专有的名称,用于定义系统调用号的常量。用户空间程序应使用的可移植名称,以SYS_开头。

GNU libc允许非便携式名称从内核的标头传递到<sys/syscall.h>;听起来musl libc没有。尝试在整个文件中将__NR_更改为SYS_进行搜索和替换。