modpost.h:12:23: 致命错误: elfconfig.h: 没有这样的文件或目录

modpost.h:12:23: 致命错误: elfconfig.h: 没有这样的文件或目录

我正在运行 Ubuntu:

#lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:    12.04
Codename:   precise
Kernel info:

3.8.0-38-generic #56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014 i686 i686 i386 GNU/Linux

我所拥有的来源是: linux-lts-raring-3.8.0

当我尝试制作我的第一个驱动程序时,出现以下错误:

make -C /usr/linux-lts-raring-3.8.0 SUBDIRS=/home/drdr/Documents/drivers/first_driver modules
make[1]: Entering directory `/usr/linux-lts-raring-3.8.0'

  WARNING: Symbol version dump /usr/linux-lts-raring-3.8.0/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
/bin/sh: 1: scripts/mod/modpost: not found
make[2]: *** [__modpost] Error 127
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/usr/linux-lts-raring-3.8.0'
make: *** [default] Error 2

然后我进入源目录中的scripts/mod/,输入make:

root@drdr:/usr/linux-lts-raring-3.8.0/scripts/mod# make modpost
cc     modpost.c   -o modpost
In file included from modpost.c:18:0:
modpost.h:12:23: fatal error: elfconfig.h: No such file or directory
compilation terminated.
make: *** [modpost] Error 1

更新 我找到了一个相关文件mk_elfconfig.c。有没有办法从中生成 elfconfig.h ;

root@drdr:/usr/linux-lts-raring-3.8.0/scripts/mod# ls -ld mk_elfconfig.c 
-rw-r--r-- 1 root root 1234 Feb 19  2013 mk_elfconfig.c

为什么我会收到此错误?我相信源代码的版本和运行的版本是相同的。

给出了驱动程序的 Makefile 和源代码这里

更新 将 config- 从 /boot 复制到我的源代码作为 .config 后:我做了

root@drdr:/home/drdr/Documents/drivers/linux-lts-raring-3.8.0#make oldconfig 
scripts/kconfig/conf --oldconfig Kconfig
#
# configuration written to .config
#

root@drdr:/home/drdr/Documents/drivers/linux-lts-raring-3.8.0# make prepare
scripts/kconfig/conf --silentoldconfig Kconfig
  SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_64.h
  SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_x32.h
  SYSTBL  arch/x86/syscalls/../include/generated/asm/syscalls_32.h
  HOSTCC  arch/x86/tools/relocs
  WRAP    arch/x86/include/generated/asm/clkdev.h
  CHK     include/generated/uapi/linux/version.h
  UPD     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h
  CC      kernel/bounds.s
  GEN     include/generated/bounds.h
  CC      arch/x86/kernel/asm-offsets.s
  GEN     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
root@drdr:/home/drd/Documents/drivers/linux-lts-raring-3.8.0# 

但驱动编译时仍然出现同样的错误:

root@drdr:/home/drdr/Documents/drivers/first_driver# make
make -C /usr/linux-lts-raring-3.8.0 SUBDIRS=/home/drdr/Documents/drivers/first_driver modules
make[1]: Entering directory `/usr/linux-lts-raring-3.8.0'

  WARNING: Symbol version dump /usr/linux-lts-raring-3.8.0/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
/bin/sh: 1: scripts/mod/modpost: not found
make[2]: *** [__modpost] Error 127
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/usr/linux-lts-raring-3.8.0'
make: *** [default] Error 2 

答案1

我不知道你到底解压了什么/usr/linux-lts-raring-3.8.0,但是:

  • 这可能不是您所需要的。
  • 该位置确实很奇怪,您不应该直接在/usr.

要编译内核模块,您需要的是标头以及通过使用相同配置编译内核而生成的更多文件。看无法加载模块:对符号 module_layout 的版本有不同意见以获得更完整的解释。

删除它/usr/linux-lts-raring-3.8.0并安装与您正在运行的内核相对应的内核头包:例如,如果您正在运行的内核来自该linux-image-3.8.0-38-generic包,则安装该linux-headers-3.8.0-38-generic包。

要针对特定​​ Debian/Ubuntu/... 内核版本(例如 )编译模块linux-headers-3.8.0-38-generic,请转到模块目录并运行

make -C /usr/src/linux-headers-3.8.0-38-generic M=$PWD

要针对正在运行的内核编译模块,请确保安装并运行适当的内核头包

make -C /lib/modules/`uname -r`/build M=$PWD

我推荐阅读kbuild/modules.tt在内核文档中。

相关内容