Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 导出的kvm内核函数在编译调用它们的内核驱动程序时会收到未定义警告_C_Linux_Linux Kernel_Kvm - Fatal编程技术网

C 导出的kvm内核函数在编译调用它们的内核驱动程序时会收到未定义警告

C 导出的kvm内核函数在编译调用它们的内核驱动程序时会收到未定义警告,c,linux,linux-kernel,kvm,C,Linux,Linux Kernel,Kvm,我试图从KVM-KVM_write_guest和KVM_get_段调用两个导出的内核函数,但是当我编译一个内核驱动程序来调用这两个函数时,我得到一个警告,说它们未定义 WARNING: "kvm_write_guest" [/home/driver.ko] undefined! WARNING: "kvm_get_segment" [/home/driver.ko] undefined! 当我执行命令时: cat /proc/kallsyms | grep kvm_get_segment ca

我试图从KVM-KVM_write_guest和KVM_get_段调用两个导出的内核函数,但是当我编译一个内核驱动程序来调用这两个函数时,我得到一个警告,说它们未定义

WARNING: "kvm_write_guest" [/home/driver.ko] undefined!
WARNING: "kvm_get_segment" [/home/driver.ko] undefined!
当我执行命令时:

cat /proc/kallsyms | grep kvm_get_segment
cat /proc/kallsyms | grep kvm_write_guest
要检查它们是否已导出,我得到以下信息:

0000000000000000 t kvm_write_guest  [kvm]
0000000000000000 t kvm_get_segment  [kvm]
下面是我在调用这些函数的.c文件中包含的头文件中包含的协议和包含。我从kvm_main.c代码中提取了原型

#include <linux/kvm.h>
#include <linux/kvm_types.h>
#include <linux/kvm_host.h>
int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, unsigned long len);
void kvm_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);

当我深入研究kvm_get_段的x86.c代码时,它也没有使用该方法导出。看起来它们实际上并没有出口,但我想确保我没有做错什么。如果可以的话,我希望避免修补代码和重新编译。提前感谢您的帮助,非常感谢

你没有做错什么。如果它们没有使用EXPORT\U SYMBOL或EXPORT\U SYMBOL\GPL导出,您将无法从模块调用它们。

看起来您有两个不同的问题。kvm_get_段仅在arch/x86/kvm/x86.c中定义,未导出。因此,如果不修补源代码或在运行时玩复杂的把戏,另一个模块就无法链接到它

另一方面,正如您所指出的,kvm_write-guest是通过以下方式导出的:

EXPORT_SYMBOL_GPL(kvm_write_guest);
这意味着只有GPL许可的模块可以链接到它;你需要把

MODULE_LICENSE("GPL");
在您的驱动程序中使用该符号。确保你了解这样做的法律含义

MODULE_LICENSE("GPL");