modpost.h:12:23: 치명적인 오류: elfconfig.h: 해당 파일이나 디렉터리가 없습니다.

modpost.h:12:23: 치명적인 오류: elfconfig.h: 해당 파일이나 디렉터리가 없습니다.

저는 우분투를 실행하고 있습니다:

#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

내가 가지고 있는 소스는 다음과 같습니다. 리눅스-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과 소스 코드가 제공됩니다.여기

고쳐 쓰다 /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커널 문서에서.

관련 정보