【问题标题】:Cross compiling a kernel module: invalid module format交叉编译内核模块:无效的模块格式
【发布时间】:2017-07-18 16:42:40
【问题描述】:

我正在尝试交叉编译带有规范的 helloworld 内核模块:

  • 主机:intel x86 32 位,linux-3.0.0
  • 目标:ARM机器(Parrot AR.Drone),linux-2.6.27.47

我正在使用生成文件:

PWD := $(shell pwd)
obj-m := test.o
all:
    $(MAKE) -C /path/to/kernel M=$(PWD) CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm  modules

其中arm-none-linux-gnueabi-是arm工具链的前缀。

作为内核,我尝试使用来自git://github.com/CyanogenMod/cm-kernel.git 的克隆作为内核。这是一个 2.6 内核分支。使用这个内核,编译成功。尝试插入模块时,出现错误:

invalid module format

可悲的是,它说得很少。

【问题讨论】:

  • 如果在插入模块时出现“invalid module format”错误以及其他错误,系统日志可能包含更多信息。 dmesg 可用于显示日志。

标签: linux-kernel arm cross-compiling kernel-module


【解决方案1】:

感谢尤金提示使用dmesg,我发现了错误:

version magic '2.6.37.6 mod_unload modversions ARMv5 ' should be '2.6.27.47-parrot preempt mod_unload ARMv5 '

结论:编译内核模块时,不仅需要匹配版本,还需要一些配置参数。通过使用正确的版本并编辑配置解决了我的问题。

如果您不想重新配置所有内容,一个快速(丑陋)的解决方法是编辑 include/generated/autoconf.h

【讨论】:

    【解决方案2】:

    我的丑陋修复是修改脚本文件 “脚本/setlocalversion”

    170         if test "${LOCALVERSION+set}" != "set"; then
    171                 scm=$(scm_version --short)
    172 #               res="$res${scm:++}"
    173                 res="${res}"
    174         fi
    

    大家好。。我确实找到了简单的解决方案。

    只需修改环境变量

    export LOCALVERSION=
    

    就是这样

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2014-10-23
      • 2014-01-25
      • 2014-05-01
      • 2014-04-30
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多