AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 473749
Accepted
Billy
Billy
Asked: 2018-10-07 23:51:33 +0800 CST2018-10-07 23:51:33 +0800 CST 2018-10-07 23:51:33 +0800 CST

编译没有 Module.symvers 的 Linux 内核模块

  • 772

我有这个嵌入式 Linux 设备。我想向它添加内核级功能,但非常希望不编译我自己的内核来这样做。(如果内核没有加载并进入用户空间,设备就会变砖;我无法访问引导加载程序来恢复它。当前的内核没有 kexec 支持,所以我不能用它来测试内核映像我自己的。)

设备的内核支持模块,但我没有相应的 Module.symvers 文件的副本。

我的问题:如果我没有 Linux 内核的 Module.symvers 文件,但确实有内核映像和为其编译的模块,我是否可以编译更多可以插入该内核的模块,也许是通过生成缺少的模块。 symvers 文件?

该设备运行 Linux 内核版本 3.10。
内核映像(在其 uImage 容器中) : https
://www.olio.watch/olio-firmware-1.10.220/olio-firmware/uImage配置(由于 CONFIG_IKCONFIG 从上图中提取):https://www.olio .watch/3.10.0-g2ae2f33-config
我拥有的一个与该内核匹配的内核模块:https ://www.olio.watch/olio-firmware-1.10.220/olio-firmware/drv2605.ko

kernel-modules
  • 1 1 个回答
  • 5309 Views

1 个回答

  • Voted
  1. Best Answer
    user88036
    2018-10-16T17:08:17+08:002018-10-16T17:08:17+08:00

    首先,为了回答您的问题“我可以在没有 Module.symvers 的情况下编译 Linux 内核模块吗”,我们需要了解的目的是什么Module.symvers:

    Module.symvers有两个主要目的:

    1) 它列出了从 vmlinux 和所有模块导出的所有符号。

    CONFIG_MODVERSIONS2) 如果启用,它会列出 CRC 。如果不CONFIG_MODVERSIONS启用,CRC 将读取 0x00000000。

    Module.symvers将在内核构建期间生成,它包含从内核和编译模块导出的所有符号。对于每个符号,还存储相应的 CRC 值。Module.symvers 文件的语法是:

        <CRC>       <Symbol>           <module>
    

    例如:

        0x2d036834  scsi_remove_host   drivers/scsi/scsi_mod
    

    话虽如此,如果我们有Module.symvers那么我们可以构建任何模块,因为它包含所有必要的符号。

    如果Module.symvers 不可用,我们仍然可以通过构建此文件或从另一个模块借用它来构建外部模块。

    通常,在构建外部模块时,构建系统需要访问内核中的符号以检查是否定义了所有外部符号。这是在一个名为MODPOST. Module.symvers此步骤通过从内核源代码树中读取来获取符号。

    如果Module.symvers正在构建外部模块的目录中存在文件,则该文件也将被读取。在该MODPOST步骤中,Module.symvers将写入一个新文件,其中包含所有未在内核中定义的导出符号。

    如果 Module.symvers文件不存在,则外部模块可能正在使用从另一个外部模块导出的符号,kbuild需要完全了解所有符号以避免吐出有关未定义符号的警告。

    对于这种情况,有三种解决方案:

    1) 使用顶级kbuild文件:如果您有两个模块,foo.ko并且bar.ko需要foo.ko来自 的符号bar.ko,您可以使用一个通用的顶级kbuild文件,以便在同一个构建中编译两个模块。考虑以下目录布局:

        ./foo/ <= contains foo.ko
        ./bar/ <= contains bar.ko
    
        The top-level kbuild file would then look like:
    
        #./Kbuild (or ./Makefile):
            obj-y := foo/ bar/
    
        And executing
    
            $ make -C $KDIR M=$PWD
    
        will then do the expected and compile both modules with
        full knowledge of symbols from either module.
    

    2) 使用额外Module.symvers文件:当构建外部模块时,Module.symvers会生成一个文件,其中包含所有未在内核中定义的导出符号。要从 中访问符号bar.ko,请将 Module.symvers 文件从 bar.ko 的编译中复制到构建 foo.ko 的目录中。在模块构建期间,kbuild将读取Module.symvers外部模块目录中的文件,当构建完成时,将Module.symvers创建一个新文件,其中包含所有已定义符号的总和,而不是内核的一部分。

    3)使用“make”变量KBUILD_EXTRA_SYMBOLS:如果从另一个模块复制不切实际,您可以在构建文件中Module.symvers分配一个以空格分隔的文件列表。KBUILD_EXTRA_SYMBOLS这些文件将modpost在其符号表初始化期间加载。

    更多详情1

    • 6

相关问题

  • 为什么 sys_call_table 是可预测的?

  • 为什么 Udev 为单个 USB 设备加载两个内核模块?

  • 如何解决 Vuurmuur 中的“内核中不支持连接跟踪”?

  • 无法设置内核模块参数

  • 在 Fedora 27 中未检测到 Broadcom 无线

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve