ARM64 Linux添加系统调用遇链接错误:未定义__arm64_sys_hello
解决ARM64 Linux内核添加系统调用时的
__arm64_sys_hello未定义错误 你的问题核心是ARM64与X86架构的系统调用命名规则、注册机制存在差异,沿用X86的步骤导致链接器找不到匹配的函数符号。以下是针对性的修正步骤:
1. 用架构兼容宏定义系统调用函数
放弃手动定义sys_hello,改用内核提供的SYSCALL_DEFINE*宏,它会自动适配不同架构的命名要求。修改mycode/hello.c内容为:
#include <linux/kernel.h> #include <linux/syscalls.h> // SYSCALL_DEFINE0 对应无参数的系统调用 SYSCALL_DEFINE0(hello) { printk(KERN_INFO "Hello from ARM64 custom syscall!\n"); return 0; }
该宏会在ARM64下自动生成__arm64_sys_hello函数,X86下生成sys_hello,无需手动适配架构。
2. 清理无效的手动函数声明
删除你在include/linux/syscalls.h中添加的asmlinkage long sys_hello(void);——SYSCALL_DEFINE*宏已经自动完成了函数声明,手动声明会导致符号不匹配。
3. 修正ARM64专属的系统调用号定义
ARM64不使用include/uapi/asm-generic/unistd.h管理自定义系统调用号,需修改架构专属头文件:
- 打开
arch/arm64/include/asm/unistd.h,找到现有系统调用号的定义区块,添加:
注意:确认441未被现有系统调用占用,可通过查看文件内已有的#define __NR_hello 441 __SYSCALL(__NR_hello, __arm64_sys_hello)__NR_*编号验证。
4. 更新ARM64系统调用表
Linux 5.10版本的ARM64内核,系统调用表存于arch/arm64/kernel/syscall_table.S,需在对应位置添加表项:
找到与__NR_hello=441对应的条目位置(比如紧跟编号440的条目之后),添加:
.quad __arm64_sys_hello
5. 重新编译内核
完成上述修改后,重新执行内核编译流程,链接阶段的未定义符号错误即可解决。
内容的提问来源于stack exchange,提问作者Lei Qian
相关产品推荐
相关产品推荐

