You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,找到现有系统调用号的定义区块,添加:
    #define __NR_hello 441
    __SYSCALL(__NR_hello, __arm64_sys_hello)
    
    注意:确认441未被现有系统调用占用,可通过查看文件内已有的__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:21:24