답변:
특히 문제는 모듈을 빌드 할 때 커널 소스 트리에 Modules.symvers 파일이 없을 수 있다는 것입니다. kbuild 시스템은 모듈을 만들 때 실제로 이것에 대해 경고합니다. Modules.symvers가 누락 된 경우 다음이 표시됩니다.
경고 : 기호 버전 덤프 /usr/src/linux-2.6.34-12/Modules.symvers가 누락되었습니다. 모듈에는 종속성과 수정이 없습니다.
커널이 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를 선호하는 경향이 있습니다 :)
커널에 해당하는 linux-headers
및 linux-source
패키지 가 모두 설치되어 있어야합니다. 예를 들어 커널의 경우 3.2.0-27-generic-pae
다음이 필요합니다.
linux-headers-3.2.0-27-generic-pae
과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)
합니다.
cd /usr/src/linux-source-$Version
.tar.bz2 아카이브를 압축 해제하고 압축을 푼 디렉토리에 CD를 넣습니다. 이미 수행 한 것 같습니다.cp /boot/config-$(uname -r) .config
커널 소스 디렉토리로cp /usr/src/linux-headers-$(uname -r)/Module.symvers .
커널 소스 디렉토리로그렇게 한 후 커널 소스 디렉토리에서 다음을 수행하십시오.
make prepare
make scripts
make M=drivers/usb/serial
- M=
필요에 따라 경로를 변경하십시오.불행히도, 나는 Module.symvers
손대지 않고 특정 모듈을 만드는 법을 모른다 . 이렇게 make drivers/usb/serial/option.ko
, 예를 들어, 죽이는 Module.symvers
파일을, 당신은 원래 문제와 끝까지. 은 Using M=
매개 변수하면 죽일,하지만 당신은 지정된 경로에있는 모든 모듈을 구축 할 필요가 없습니다 - 나는 아직 주위에있는 방법을 발견하지 않았습니다.
실행하기 전에 정확히 동일한 커널 구성을 사용해야합니다 make prepare
. 또한 트리 외부에서 빌드하는 경우 현재 실행중인 커널 (또는 컴파일 할 때 실행하지 않는 경우 대상 커널)과 일치하는 정확히 동일한 커널 헤더에 대해 빌드해야합니다.