问题描述
我正在尝试在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位系统调用(gettimeofday
,clock_gettime
,clock_getres
)与musl对struct timeval
和struct timespec
的定义不兼容。为了防止意外地用错误的类型调用这些系统调用,在此环境中不提供相应的系统调用常量。
以__NR_
开头的标识符是不可移植的,Linux内核专有的名称,用于定义系统调用号的常量。用户空间程序应使用的可移植名称,以SYS_
开头。
GNU libc允许非便携式名称从内核的标头传递到<sys/syscall.h>
;听起来musl libc没有。尝试在整个文件中将__NR_
更改为SYS_
进行搜索和替换。