【问题标题】:What are the __NR_-prefixed symbols in glibc?glibc 中以 __NR_ 为前缀的符号是什么?
【发布时间】:2020-09-29 16:04:09
【问题描述】:

我正在尝试在 Alpine Linux 上编译 Box86,这是一个使用 musl libc 实现而不是 glibc 的 Linux 发行版。在完成 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

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

【问题讨论】:

  • 它们不应该是函数,而是应该扩展为数字的宏,即系统调用号。您应该包含 <sys/syscall.h> 以便将定义拉入。
  • @user414777 对,写到一半我意识到这些可能不是函数,并更改了我随后的措辞(但忘记更改标题)。谢谢。我会看看这是否有效。
  • @user414777 实际上,<sys/syscall.h> 似乎已经包含在内了? github.com/ptitSeb/box86/blob/master/src/emu/x86syscall.c#L7(我没有看到任何 ifndef:s 围绕它)
  • 那么你的系统头文件没有定义它们。并非所有平台和 linux 内核版本上都存在所有系统调用号。尝试 ifdef'ing 他们,例如__NR_getrandom 已经是了。但最好提交错误报告,以便他们修复代码。

标签: c linux compiler-errors glibc musl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    GNU libc 允许不可移植的名称从内核的头文件传递到<sys/syscall.h>;听起来 musl libc 没有。尝试在整个文件中搜索并替换将 __NR_ 更改为 SYS_

    【讨论】:

    • 你的 musl 理论听起来很合理,但奇怪的是还有很多其他 __NR_ 前缀常量它没有抱怨 (like literally every __NR_-prefixed constant here apart from the ones I mentioned)。是什么赋予了? musl会错过这些吗?
    • 我对 musl libc 不是很熟悉。也许它确实定义了一些__NR_ 名称以与针对 GNU libc 开发的特定于 Linux 的程序兼容,但它们是手动添加的,因此它不是一个详尽的集合。也许它确实从内核自己的头文件(特别是asm/unistd*.h)通过__NR_*,但是相对于Box86开发人员使用的系统,您正在构建的系统上的这些头文件的副本已经过时了。也许正在发生更奇怪的事情。我可能帮不了你了。
    猜你喜欢
    • 2023-04-02
    • 2012-05-17
    • 1970-01-01
    • 2012-06-25
    • 2017-12-10
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多