c - 加载内核模块时出现未知符号

标签 c linux ubuntu kernel-module

我试图重做本主题中找到的内核模块的代码 How can I obtain battery level inside a Linux kernel module? .但是当我尝试使用 power_supply.h 头文件中包含的函数时,模块加载失败,因为它无法识别 power_supply_get_by_name 函数。

这是我在内核版本为 4.15.0-101-generic 的 Ubuntu 18.04 上使用的代码:

#include <linux/module.h>
#include <linux/power_supply.h>

static int __init test_init (void)
{
        struct power_supply *psy;
        char name[] = "BAT1";

        psy = power_supply_get_by_name(name);

        printk(KERN_DEBUG "Test module inserted");

        return 0;
}

static void __exit test_exit (void)
{
        printk(KERN_DEBUG "Test module removed");
}

module_init (test_init);
module_exit (test_exit);

我在编译时没有收到错误,除了关于模块许可证的警告,我认为这与我的问题无关,但我收到以下错误:
  • 在终端运行 insmod 时:“insmod: ERROR: could not insert module test.ko: Unknown symbol in module”
  • 在/var/log/kern.log 文件中:“测试:未知符号 power_supply_get_by_name (err 0)”

  • 我检查了 kallsyms proc 文件,如果我很好地理解了这个主题 What is the difference between T and t in /proc/kallsyms,该函数被指示为在其他内核模块中可用.这是读取 kallsyms 文件的输出:
    ffffffff8e9bd270 T power_supply_get_by_name
    

    有谁知道为什么这不起作用,而我可以毫无问题地使用其他 linux 头文件功能,如果是这样,我该如何解决我的问题?

    提前致谢

    最佳答案

    这实际上可能与模块许可证有关!如果你查看内核源代码,函数 power_supply_get_by_name已导出 here .你可以看到它正在使用 EXPORT_SYMBOL_GPL .如this answer解释:

    EXPORT_SYMBOL_GPL will show the symbol only in GPL-licensed modules



    这个宏的使用是有争议的,但这就是项目的运作方式......要访问您需要的符号,您需要将您的模块许可为 GPL:
    MODULE_LICENSE("GPL");
    

    关于c - 加载内核模块时出现未知符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62308934/

    相关文章:

    linux - 如何反转 grep 命令的输出?

    java - 无法使用 Openshift 客户端工具

    ruby-on-rails - sudo gem install pg 不起作用

    c - 使用 gcc 编译 C 程序

    c - MPU6050与STM32F303的响应时间

    c - 如何从 Visual Studio C 编译器获得更有用的警告?

    linux - 如何找到使用特定内核模块的进程列表?

    objective-c - 奇怪的 Objective-C/C `enum` 行为

    php - Jorani - 无法加载请求的语言文件 : language/fr/global_lang. php

    python-3.x - 在 AWS Ubuntu EC2 实例中使用 Python 进行 IP 切换