usbhid.ko를로드하려고 할 때“module_layout의 심볼 버전이 없습니다”


27

에 대한 자체 모듈을 만들려고하는데 usbhid.ko컴파일 후 모듈을 로드 할 수 없습니다. dmesg말한다 no symbol version for module_layout. 문제가 무엇인지 궁금합니다. 우분투에서 제공하는 커널 소스를 이미 사용했으며 커널 버전이 동일한 지 확인했습니다.

답변:


22

특히 문제는 모듈을 빌드 할 때 커널 소스 트리에 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를 선호하는 경향이 있습니다 :)


1
"어리석은 modprobe에게 모든 쓰레기를 무시하고 어쨌든 모듈을로드하기 위해 +1"이라고 주석하십시오.
Hayri Uğur Koltuk 2016 년

2를 시도했는데 부팅시 모듈이 자동로드되지 않는다는 것을 알았습니다. 부팅시 -f하는 방법이 있습니까?
저스틴 장

17

커널에 해당하는 linux-headerslinux-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/serial- M=필요에 따라 경로를 변경하십시오.

불행히도, 나는 Module.symvers손대지 않고 특정 모듈을 만드는 법을 모른다 . 이렇게 make drivers/usb/serial/option.ko, 예를 들어, 죽이는 Module.symvers파일을, 당신은 원래 문제와 끝까지. 은 Using M=매개 변수하면 죽일,하지만 당신은 지정된 경로에있는 모든 모듈을 구축 할 필요가 없습니다 - 나는 아직 주위에있는 방법을 발견하지 않았습니다.


이것은 같은 트리 버전으로 모듈을 컴파일 할 경우에 가장 좋은 방법 인 것 같습니다.
Treviño

2

실행하기 전에 정확히 동일한 커널 구성을 사용해야합니다 make prepare. 또한 트리 외부에서 빌드하는 경우 현재 실행중인 커널 (또는 컴파일 할 때 실행하지 않는 경우 대상 커널)과 일치하는 정확히 동일한 커널 헤더에 대해 빌드해야합니다.


"make mrproper", "cp / boot / config-$ (uname -r) .config", "make oldconfig", "make preparation", "make scripts"이 지침을 사용하여 컴파일을 준비했습니다. 올바른 구성 파일을 복사했는지 알고 싶습니다. / boot /의 커널 버전과 일치하는 구성이 하나만있는 것 같습니다. 주석 상자에 형식이 없으므로 형식에 대해 죄송합니다.
SpecC

예, 맞습니다. 빌드를 어디에서 호출하고 있고 최상위 디렉토리가 아닌 경우 어떤 SUBDIRS 값을 전달하고 있습니까?
다니엘 T 첸

답장을 보내 주셔서 감사합니다. usbhid.ko를 만들려고 할 때. 나는 "make modules SUBDIRS = drivers / hid / usbhid"명령을 사용했다
SpecC

"make 모듈 SUBDIRS = drivers / hid / usbhid"명령을 실행하면 다음 경고 "경고 : Symbol version dump /usr/src/linux-source-2.6.31/Module.symvers가 없습니다. 의존성 및 개조 없음. "
SpecC

@SpecC 문제를 조사 할 때 수행중인 단계로 원래 질문을 업데이트하십시오. 그런 다음 Dan은 자신의 답변을 업데이트하고, 끝까지 묻힌 일련의 주석 대신 알아낼 때까지 계속 업데이트합니다. meta.askubuntu.com/questions/257/how-does-ask -ubuntu-work
Jorge Castro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.