gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:17 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com