内核生成 "ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0):对 '__x64_sys_s_enable'的未定义引用"



OS是Ubuntu 20.10内核源代码是linux_5.8.0-59.66

我正在将Centos7Rhel7.9的内核修改移植到Ubuntu。

原始的未修改的Ubuntu内核源代码在这台机器上干净地编译和运行。编译器设置似乎运行正常。

我当前的问题与我添加的系统调用有关。生成的错误为-

LD      .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): undefined reference to `__x64_sys_s_enable'
BTF     .btf.vmlinux.bin.o    
Segmentation fault (core dumped)
LD      .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: file not recognized: file format not recognized
make: *** [Makefile:1163: vmlinux] Error 1

我已经搜索并在谷歌上搜索了这个原始错误";未定义引用";,找到了可能的修复程序,但没有成功。

以下是我用来添加系统调用的步骤,该调用最初在Centos 7和RHEL 7.9上工作。

修改/SOURCE-DIRETORY/include/linux/syscalls.h注释原始行并添加对__64的引用(包括上面的空白行(-

asmlinkage long __64_sys_s_enable(int s_enable_flag);
//asmlinkage long sys_s_enable(int s_enable_flag);

修改/SOURCE-DIRETORY/arch/x86/include/asm/syscalls.h添加-

440     64      s_enable        sys_s_enable

字段由TAB分隔,我没有添加任何空行。

创建了源目录和文件-source-DIRETORY/s_enable,其中包含s_enable.c。s_enable.c的整体是

#include <linux/kernel.h>
extern int s_enable_flag;
asmlinkage long sys_s_enable(int i)
{
//       printk(KERN_INFO "In ORIGINAL SYSCALL s_enablen");
s_enable_flag = i;
return 0;
}

并将相应的syscall目录添加到Makefile中。

core-y          += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ s_enable/

并运行";sudo make";。

我不确定我可能做错了什么;制造";与原始内核源代码一起工作,我试图添加的系统调用在其他提到的发行版上也起了作用。

感谢您提供的任何意见。

更新时间:2021年7月18日为了使用SYSCALL_DEFINE1,我于2021年7月17日进行了以下更改。

SOURCEDIR/include/linux/syscalls.h对sys_s_enable的引用已被注释掉。

//asmlinkage long sys_s_enable(int s_enable_flag);

SOURCEDIR/arch/x86/entry/syscalls/syscall_64.tbl"64〃;改为";普通的";

440     common  s_enable        sys_s_enable

SOURCEDIR/Makefile已被编辑为从core-y 中删除SOURCEDIR/s_enable

core-y          += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
#core-y          += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ s_enable/

使用SYSCALL_DEFINE1 将原始s_enable.c复制/编辑到SOURCEDIR/kernel/sys.c中

SYSCALL_DEFINE1(su_enable, int, i)
{
extern int s_enable_flag;
s_enable_flag = i;
return 0;
}

编译命令是sudo make-j4,花费了12-15个小时,这在某种程度上是正常的。

错误是

LD      .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): undefined reference to `__x64_sys_s_enable'

谢谢-收到

如果我们想创建自己的系统,请调用更新版本的Linux__x64_sys_

以下是起始中arch/x86/entry/syscalls/syscall_64.tbl的注释

x64_sys*((存根是为sys*((系统调用动态创建的

因此,我们的系统调用函数名称可能以__x64_sys_开头,这是您自己的函数的示例代码。

asmlinkage long __x64_sys_s_enable(int i)
{
//       printk(KERN_INFO "In ORIGINAL SYSCALL s_enablen");
s_enable_flag = i;
return 0;
}

然后include/linux/syscalls.h文件可能需要添加与函数名称一致的前缀名称

asmlinkage long __x64_sys_s_enable(int i);

系统调用条目,我们可以使用您期望的函数名称arch/x86/entry/syscalls/syscall_64.tbl

440     common  s_enable       sys_s_enable

如果我们遵循这些步骤,我们可以重新编译您的内核,并且我们可能会获得成功的构建。

最新更新