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
    • 最新
    • 标签
主页 / ubuntu / 问题 / 14627
In Process
SpecC
SpecC
Asked: 2010-11-24 15:08:28 +0800 CST2010-11-24 15:08:28 +0800 CST 2010-11-24 15:08:28 +0800 CST

尝试加载 usbhid.ko 时出现“module_layout 没有符号版本”

  • 772

我正在尝试为 构建自己的模块usbhid.ko,但是编译后,我无法加载该模块。dmesg说no symbol version for module_layout。我想知道是什么问题?我已经使用了 Ubuntu 提供的内核源代码,并且我还确保内核版本是相同的。

kernel modules
  • 3 3 个回答
  • 65941 Views

3 个回答

  • Voted
  1. Dan Gora
    2012-02-07T16:08:33+08:002012-02-07T16:08:33+08:00

    具体来说,问题是当您构建模块时,内核源代码树可能缺少 Modules.symvers 文件。当您构建模块时,kbuild 系统实际上会警告您这一点。如果 Modules.symvers 缺失,您将看到:

    警告:缺少符号版本转储 /usr/src/linux-2.6.34-12/Modules.symvers;模块将没有依赖项和 modversions。

    如果您的内核已CONFIG_MODVERSIONS启用,那么在构建驱动程序的 modpost 阶段,它将使用 -m 选项运行scripts/mod/modpost 。如果您勇敢地查看scripts/mod/modpost.c源代码,您会看到 -m 选项添加了 vmlinux 中的 _module_layout_ 符号,但是如果您的内核中没有 Modules.symvers,你不会得到这个符号的 CRC 值,你最终会得到这个错误消息。

    所以有两种方法可以解决这个问题。

    1) 运行您正在运行的内核的完整版本以生成 Modules.symvers,然后重建您的模块。[http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt][1]

    51  === 2. How to Build External Modules
    52  
    53  To build external modules, you must have a prebuilt kernel available
    54  that contains the configuration and header files used in the build.
    55  Also, the kernel must have been built with modules enabled. If you are
    56  using a distribution kernel, there will be a package for the kernel you
    57  are running provided by your distribution.
    58  
    59  An alternative is to use the "make" target "modules_prepare." This will
    60  make sure the kernel contains the information required. The target
    61  exists solely as a simple way to prepare a kernel source tree for
    62  building external modules.
    63  
    64  NOTE: "modules_prepare" will not build Module.symvers even if
    65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
    66  executed to make module versioning work.
    

    2)另一个选项是告诉愚蠢的 modprobe 忽略所有这些废话,并且无论如何都加载您的模块:

    modprobe -f <module>
    

    我倾向于选择选项2 :)

    • 23
  2. Radu C
    2012-08-04T09:07:56+08:002012-08-04T09:07:56+08:00

    安装与您的内核对应的linux-headers和linux-source软件包。例如对于内核3.2.0-27-generic-pae,您需要:

    1. linux-headers-3.2.0-27-generic-pae和
    2. linux-source-3.2.0-27-generic-pae.

    如果上述软件包的版本与您正在运行的内核版本不匹配,那么您需要$(uname -r)使用上面安装的内核软件包中的版本字符串进行替换。
    对于上面的例子,包版本是3.2.0-27-generic-pae. 当您运行uname -r并且其输出有所不同时,3.2.0-27-generic-pae您需要替换$(uname -r)下面的每个以匹配已安装软件包中的版本字符串。

    1. cd /usr/src/linux-source-$Version并解压 .tar.bz2 存档并 cd 进入提取的目录 - 我猜你已经这样做了
    2. cp /boot/config-$(uname -r) .config进入内核源目录
    3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers .进入内核源目录

    完成后,在内核源目录中,执行以下操作:

    1. make prepare
    2. make scripts
    3. make M=drivers/usb/serialM=-根据您的需要更改路径

    不幸的是,我不知道如何在保持Module.symvers不变的情况下构建特定模块。make drivers/usb/serial/option.ko例如,这样做会杀死Module.symvers文件,最终会遇到最初的问题。使用M=参数并不会杀死它,但是您必须在指定路径中构建所有模块 - 我还没有找到解决它的方法。

    • 18
  3. Daniel T Chen
    2010-11-24T20:04:14+08:002010-11-24T20:04:14+08:00

    在运行之前,您必须使用完全相同的内核配置make prepare。此外,如果您在树外构建它,则需要针对与当前运行的内核(或者如果您在编译时没有运行它,则为目标)匹配的完全相同的内核头文件来构建它。

    • 2

相关问题

  • 为 i7 处理器编译内核的最佳方法是什么?

  • 未连接到任何可见进程的令人讨厌的 CPU 峰值

  • 如何让我的电脑中的风扇在暂停时关闭?[关闭]

  • Ubuntu 是否支持与 SSD 一起使用的 TRIM 命令?

  • 使用 apt-get upgrade 时如何强制安装内核更新?

Sidebar

Stats

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

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve