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