MacOS环境下安装XV6遭遇无限递归编译错误求助
在macOS上编译XV6时遇到无限递归编译错误
操作步骤
- 克隆mit-pdos的xv6-public代码仓库
- 执行
brew install qemu安装QEMU - 通过brew安装i386-elf工具链:
brew tap nativeos/i386-elf-toolchain brew install nativeos/i386-elf-toolchain/i386-elf-binutils brew install nativeos/i386-elf-toolchain/i386-elf-gcc
- 替换适配macOS的Makefile后,执行
make qemu clean,触发编译错误:
i386-elf-gcc -fno-pic -std=gnu17 -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -march=i686 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie -c -o sh.o sh.c sh.c: In function 'runcmd': sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion] 58 | runcmd(struct cmd *cmd) | ^~~~~~ sh.c:89:5: note: recursive call 89 | runcmd(rcmd->cmd); | ^~~~~~~~~~~~~~~~~ sh.c:109:7: note: recursive call 109 | runcmd(pcmd->left); | ^~~~~~~~~~~~~~~~~~ sh.c:116:7: note: recursive call 116 | runcmd(pcmd->right); | ^~~~~~~~~~~~~~~~~~~ sh.c:95:7: note: recursive call 95 | runcmd(lcmd->left); | ^~~~~~~~~~~~~~~~~~ sh.c:97:5: note: recursive call 97 | runcmd(lcmd->right); | ^~~~~~~~~~~~~~~~~~~ sh.c:127:7: note: recursive call 127 | runcmd(bcmd->cmd); | ^~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors make: *** [sh.o] Error 1
解决方法
这个错误源于新版i386-elf-gcc默认启用-Werror=infinite-recursion规则,将警告直接转为错误,而XV6的runcmd函数本身是合法的递归逻辑(处理不同命令类型时调用自身),并非真正的无限递归。
可以通过以下两种方式解决:
修改Makefile禁用该警告
找到Makefile中定义CFLAGS的行,添加-Wno-infinite-recursion参数,示例:CFLAGS = -fno-pic -std=gnu17 -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -march=i686 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie -Wno-infinite-recursion给runcmd函数添加前置声明
在sh.c文件的runcmd函数定义之前,添加函数声明:void runcmd(struct cmd *cmd);帮助编译器明确函数的递归结构,避免误判。
两种方法任选其一即可,推荐第一种,无需修改XV6源码,仅调整编译参数即可。
内容的提问来源于stack exchange,提问作者Ku-hello
相关产品推荐
相关产品推荐

