我是 C 和 Linux 开发新手,所以如果这听起来令人困惑,我很抱歉。
我设法通过更新 syscall_64.tbl、将 asmlinkage 方法定义添加到 syscalls.h、将文件夹添加到主 makefile 并创建只有一行的 makefile 来成功创建一个非常简单的系统调用:
obj-y := syscall.o
在此之前没有问题,我编译了 Linux 源代码并且它工作了。我想构建一个更高级的系统调用。所以我在 vmx.c(在 arch/x86/kvm 中)添加了一个函数:
void myFunction(void){
//Some code
}
EXPORT_SYMBOL(myFunction);
并在vmx.h中定义(在arch/x86/include/asm中):
void myFunction(void);
现在问题开始了。我将 vmx.h 包含到我的 syscall.c 文件中并调用了这个函数。当我尝试编译 Linux 源代码时,我收到“对 myFunction 的 undefined reference ”。我究竟做错了什么?这是我的 syscall.c:
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <asm/vmx.h>
asmlinkage long sys_customsyscall(const char *test)
{
printk(KERN_ALERT "Test: %s,\n", test);
myFunction();
return 0;
}
最佳答案
在你完成这些事情之后,如果你在 vmx.c
中使用你的函数,那么接下来需要考虑的是 Linux/arch/x86/kvm/Makefile
你可以看到这样
kvm-intel-y += vmx.o pmu_intel.o
所以在编译的时候一定要使用intel的配置,而不是amd的,否则是无法和源码一起编译的!如果是 amd,您可以在 svm.c
中定义它。
然后,确保在 make menuconfig 中也启用了虚拟化
此外,在您确定该 block 之前,您的函数原型(prototype)、定义/声明不应属于任何#ifdef 或类似内容。
同时检查 vmx.h,您在定义时添加了 extern
关键字。
关于c - 在自定义系统调用中使用内核模块函数 - undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36830825/