Xv6实现getprocs()系统调用时遇undefined reference错误求助
问题分析与修复方案
核心问题:链接器找不到sys_getprocs符号
错误提示里的undefined reference to sys_getprocs,本质是你新建的kernel/getprocs.c没有被加入内核编译流程,导致该文件的代码从未被编译成目标文件,链接时自然找不到对应的符号。
具体修复步骤
1. 修改内核Makefile,添加新文件
打开kernel/Makefile,找到OBJS(或KERNEL_OBJS)变量,在列表末尾添加getprocs.o。示例:
OBJS = \ entry.o \ start.o \ trap.o \ ... syscall.o \ getprocs.o # 新增这一行
2. 补充函数声明(可选但推荐,消除编译警告)
- 在
kernel/syscall.c顶部添加sys_getprocs的声明:uint64 sys_getprocs(void); - 在
kernel/proc.h中添加get_procs的声明,让getprocs.c里的extern生效:int get_procs(void);
3. 移除syscall函数里的冗余分支(优化)
你在syscall()里单独加了if(num == SYS_getprocs)分支,其实没必要——既然已经把sys_getprocs加入syscalls表,原有分支逻辑会自动处理该系统调用号。可以删除这行分支,恢复原有逻辑:
void syscall(void) { int num; struct proc *p = myproc(); num = p->trapframe->a7; if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { p->trapframe->a0 = syscalls[num](); } else { printf("%d %s: unknown sys call %d\n", p->pid, p->name, num); p->trapframe->a0 = -1; } }
4. 重新编译验证
执行make clean && make qemu,清理旧编译产物后重新编译,即可解决链接错误。
另外,cannot find entry symbol _entry的警告是编译流程异常导致的连带问题,修复核心问题后会自动消失。
内容的提问来源于stack exchange,提问作者Overstacked
相关产品推荐
相关产品推荐

