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 位系统调用(gettimeofday
、clock_gettime
、clock_getres
)与 musl 对 struct timeval
和 struct timespec
的定义不兼容。为了防止意外调用那些类型错误的系统调用,相应的系统调用常量在此环境中不可用。
我正在尝试编译 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 位系统调用(gettimeofday
、clock_gettime
、clock_getres
)与 musl 对 struct timeval
和 struct timespec
的定义不兼容。为了防止意外调用那些类型错误的系统调用,相应的系统调用常量在此环境中不可用。