在自定义系统调用中使用内核模块函数 - 未定义的引用错误

时间:2016-04-25 01:29:11

标签: c linux linux-kernel kernel

我是初学C和Linux开发人员,所以如果这听起来很混乱,我很抱歉。

我设法通过更新syscall_64.tbl成功创建一个非常简单的系统调用,将asmlinkage方法定义添加到syscalls.h,将文件夹添加到main 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文件中并调用了此函数。我得到了一个未定义的对myFunction的引用"当我尝试编译Linux源代码时。我究竟做错了什么?这是我的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;
}

2 个答案:

答案 0 :(得分:2)

在您完成的事情之后,如果您在vmx.c中使用您的功能,则需要考虑下一件事,然后在Linux/arch/x86/kvm/Makefile中您可以看到这样的事情

kvm-intel-y             += vmx.o pmu_intel.o

因此,在编译时确保,您使用的是intel的配置,而不是amd,否则它将无法与源代码一起编译!如果它是amd你可以在svm.c内定义它。

使用它,确保在make menuconfig中也启用了Virtualization Virtualization

此外,您的函数原型,定义/声明不应属于任何#ifdef或类似的,直到您确定该块为止。

还要检查vmx.h,在定义时添加了extern个关键字。

答案 1 :(得分:1)

您需要导出该符号,以便其他组件可以引用该符号,添加

EXPORT_SYMBOL(myFunction);