netfilter를 사용하여 웹훅을 작성했습니다. 모듈이 내 우분투 16.04에서 성공적으로 컴파일됩니다.
이제 맞춤형 Linux를 사용하고 랩톱에서 동일한 버전의 커널을 사용하는 임베디드 보드에서 이를 컴파일하고 싶습니다. 유일한 문제는 내 임베디드 보드의 모든 모듈이 .ko.xz
포맷되어 있고 메이크파일이 실패하며 문제를 해결하는 방법을 모른다는 것입니다.
내 원래 메이크파일은 다음과 같습니다.
obj-m += sysfirewall.o
all:
make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) clean
하지만 임베디드 Linux에서 빌드 폴더를 찾을 수 없기 때문에 실패합니다. 빌드 폴더 대신 커널 폴더가 있어서 커널로 교체했습니다.
이제 내 메이크파일은 다음과 같습니다.
obj-m += sysfirewall.o
all:
make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) clean
하지만 현재 디렉터리에서 make를 실행하면 다음 오류가 발생합니다.
$ make -C /lib/modules/4.14.49-ti-r54/kernel -I/usr/Include/ M=/home/parsa/firewall/ modules
make[1]: Entering directory '/lib/modules/4.14.49-ti-r54/kernel'
make[1]: *** No rule to make target 'modules'. Stop.
make[1]: Leaving directory '/lib/modules/4.14.49-ti-r54/kernel'9-ti-r54/uname -i
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 2
이 문제를 어떻게 해결할 수 있나요? 커널에 있는 모든 모듈의 압축을 풀어야 합니까? 이것이 실제로 압축된 Linux 커널 모듈의 문제입니까, 아니면 오류가 다른 것을 나타내는 것입니까?
추신: 저는 이 모듈을 제 노트북에서 크로스 컴파일하고 싶지 않습니다.
편집: 내 임베디드 보드에는 없는 "/lib/modules/$(shell uname -r)/kernel" 폴더에 Makefile이 있어야 한다는 것을 알았습니다. 내 노트북의 "/lib/modules/$(shell uname -r)/build" 폴더에서 Make 파일을 추적한 결과 /usr/src/linux-headers-4.4.0-128/ Makefile에 대한 소프트 링크로 이동한다는 것을 깨달았습니다. . 하지만 내 임베디드 보드에는 /usr/src에 아무것도 없습니다. 그래서 이 모듈을 컴파일하려면 make 파일을 찾아야 할 것 같은데, 어떻게 해야 할지 모르겠어요!
답변1
문제는 압축이 아니라 make
올바른 파일을 찾지 못하는 것입니다. make 명령은 /lib/modules/<kernel version>/kernel
디렉토리에 들어간 다음 오류를 보고합니다. 그래서 그곳에서는 필요한 것을 아무것도 찾지 못합니다.
/lib/modules/<kernel version>/kernel
다음으로 바꿀 수 없습니다 /lib/modules/<kernel version>/build
: 내용이 다릅니다. 이 kernel
디렉토리에는 특정 커널 버전과 함께 제공되는 컴파일된 모듈이 포함되어 있습니다. 이는 명령에 전혀 도움이 되지 않습니다. 커널 소스와 함께 제공되는 make
makefile 및 파일이 필요합니다. .h
이들 중 일부는 기본 커널 컴파일의 일부로 동적으로 생성됩니다.
일반적으로 /lib/modules/<kernel version>/build
특정 커널 버전과 관련된 커널 헤더 위치에 대한 심볼릭 링크입니다. 임베디드 보드가 "Debian 방식"으로 컴파일된 커널을 사용하는 경우(즉, make bindeb-pkg
커널 소스 디렉터리에 커널 또는 유사한 커널이 있음) 커널 컴파일 프로세스에서 여러 .deb
패키지를 생성해야 합니다.
linux-image-<version>_<patchversion>_<architecture>.deb
= 실제 컴파일된 커널 및 해당 모듈linux-headers-<version>_<patchversion>_<architecture>.deb
= 이 특정 커널에 대해 더 많은 커널 모듈을 컴파일하는 데 필요한 헤더
이 경우 linux-headers
ARM 보드에서 사용 중인 정확한 커널 버전에 해당하는 패키지를 찾아 설치하기만 하면 됩니다. 그러면 자동으로 /lib/modules/<kernel version>/build
링크가 제공됩니다.
레거시 또는 유사한 수단을 사용하여 사용자 정의 커널을 컴파일한 경우 링크를 직접 제공 make bzimage
해야 합니다 . /lib/modules/<kernel version>/build
실제 커널 빌드 디렉토리가 여전히 사용 가능하다면 이를 /lib/modules/<kernel version>/build
.