c - 在自定义系统调用中使用内核模块函数 - undefined reference 错误

标签 c linux linux-kernel kernel

我是 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 中也启用了虚拟化 Virtualization

此外,在您确定该 block 之前,您的函数原型(prototype)、定义/声明不应属于任何#ifdef 或类似内容。

同时检查 vmx.h,您在定义时添加了 extern 关键字。

关于c - 在自定义系统调用中使用内核模块函数 - undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36830825/

相关文章:

linux - java.lang.UnsatisfiedLinkError :/usr/local/jdk5/jre/lib/i386/xawt/libmawt. so : libXext. so.6:无法打开共享对象文件:没有这样的文件或目录

在 Linux 内核中创建您自己的自定义信号

c - 在用户空间使用 netlink 从内核接收数据时出错

c - 浮点值的格式说明符 — 点计数吗?

c - 使用 fread 时出现段错误,无法从文件中读取数据

c - 变长数组/alloca在栈中的哪里分配

linux - 如何为我的用户空间程序之一禁用 "demand paging"?

c - 为什么前几个字符串赋值比较慢?

python - 导入错误 : cannot import name QtGui

c++ - FIO 运行时不同于 gettimeofday()