微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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_进行搜索和替换。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。