단일 트리 커널 모듈을 빌드하는 방법


36

linux-source -...에는 config /boot/config-3.4-trunk-686-pae에서 비활성화 된 모듈이있어 linux-image -...의 일부가 아닙니다 (이것은 데비안에 있지만 해결책은 Ubuntu와 동일해야합니까?

# CONFIG_CAN_PEAK_USB is not set

분산 커널과 함께 사용할 수 있도록 커널 모듈을 어떻게 컴파일합니까?

각각의 linux-source -... 패키지는 이미 설치되어 있고 압축되지 않았으며 / usr / src / linux에 링크되어 있습니다. /boot/config-3.4-trunk-686-pae는 /usr/src/linux/.config에 복사되고

CONFIG_CAN_PEAK_USB=m

make
make modules

커널과 모든 모듈을 컴파일 할 수 있습니다. 그러나 특정 단일 모듈 만 어떻게 컴파일합니까?

(참고 : 또한 커널을 컴파일해야합니다. 그렇지 않으면 다음 오류가 발생합니다. no symbol version for module_layout)


14627의 사본으로 닫으십시오. 사용자 'Radu C'의 답변이 질문에 답변합니다.
mab

depmod -a전에 해봤 어 modbrobe?
Nadia

1
다음 기사도 고려하십시오 : stackoverflow.com/questions/8744087/…
Oleg Kokorin

답변:


37

나는 같은 문제가 있었다. .config뿐만 아니라 Module.symvers도 복사해야한다고 가정합니다.

ft1000 모듈을 컴파일하는 나의 단계 (Debian Wheeze 7.1.0; kernel 3.2.0-4-686-pae 실행) :

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000

4
SUBDIRS가 여전히 올바른지 확실하지 않습니다. 그것은 나를 위해 무시되었습니다. kernel.org/doc/Documentation/kbuild/modules.txt를 읽은 후 make M=/path/to/module작동하는 것처럼 보았습니다 .
harmic

컴파일 할 때 다른 모듈을 수정하려고합니다 (존재하는 모듈에 USB ID를 추가하는 것입니다). 오류가 없지만 삽입 할 때 잘못된 모듈 형식이 표시됩니다!
Zibri

13

최상위 소스 디렉토리에서 간단히 모듈 이름 또는 모듈 디렉토리의 경로를 지정하십시오.

make drivers/net/can/usb/peak_usb/

또는 더 간단한 예 (Intel e1000 이더넷 드라이버) :

make drivers/net/ethernet/intel/e1000/e1000.ko

그냥 : make drivers/net/can/usb/peak_usb/pcan_usb.kopcan_usb.o 만 빌드했습니다. make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.ko컴파일 하면 컴파일되지만 insmod는 불평 Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format합니다. dmesg :peak_usb: no symbol version for module_layout
mab

특정 커널을 실행 중이고 이미 커널을 한 번 컴파일 했습니까? 함께 시도하십시오 modprobe.
ish

패키지 커널을 실행 중입니다. 완전한 커널 컴파일. 그러나 완전한 커널을 컴파일하지 않고 특정 커널 모듈 만 컴파일하려고합니다. 단일 모듈 컴파일을 '준비'하는 make 대상이 있습니까? modprobe는 같은 오류를 보여줍니다.
mab

6
stackoverflow 에 따르면 그냥 make modules SUBDIRS=drivers/net/can/usb/peak_usb다른 하위 디렉토리를 사용할 수 있습니다 . 여기서 잘 작동합니다.
Treviño

0

다음과 같이 간단합니다 (이 예에서는 ft1000 드라이버를 보여줍니다. 즉석이 아닌 경우 몇 분이 소요됩니다)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

그런 다음 modprobe이후에 모듈을로드 할 수 있습니다depmod

참고 : 모듈 종속성에 따라 커널을 완전히 다시 작성해야 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.