【问题标题】:Exported kvm kernel functions get undefined warning when compiling a kernel driver that calls them编译调用它们的内核驱动程序时,导出的 kvm 内核函数会收到未定义的警告
【发布时间】:2014-06-27 17:49:07
【问题描述】:

我正在尝试从 KVM 调用两个导出的(可能)内核函数 - kvm_write_guestkvm_get_segment,但是当我编译将调用这两个函数的内核驱动程序时,我收到一条警告说它们未定义。

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_write_guestkvm_main.c 源代码时,它们似乎没有使用以下代码导出:

EXPORT_SYMBOL_GPL(kvm_write_guest);

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

【问题讨论】:

    标签: c linux linux-kernel kvm


    【解决方案1】:

    你没有做错任何事。如果它们不是使用 EXPORT_SYMBOL 或 EXPORT_SYMBOL_GPL 导出的,您将无法从模块中调用它们。

    【讨论】:

      【解决方案2】:

      看起来你有两个不同的问题。 kvm_get_segment 仅在 arch/x86/kvm/x86.c 中定义,不导出。因此另一个模块无法链接到它(无需修补源代码或在运行时播放复杂的技巧)。

      另一方面,正如您所指出的,kvm_write-guest 导出,其中:

      EXPORT_SYMBOL_GPL(kvm_write_guest);
      

      这意味着只有 GPL 许可的模块才能链接到它;你需要把

      MODULE_LICENSE("GPL");
      

      在您的驱动程序中使用该符号。 (并确保您了解这样做的法律影响)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 2020-02-03
        • 1970-01-01
        • 2014-04-28
        相关资源
        最近更新 更多