kexec를 모듈로 빌드하려고 하는데 이상한 문제가 발생했습니다. 내 obj-m은 다음과 같습니다
obj-m += kexec.o machine_kexec.o relocate_kernel.o
makefile을 실행하면 "relocate_kernel.o에 필요한 대상 relocate_kernel.c를 만드는 규칙이 없습니다"라는 메시지가 나타납니다.
어셈블리 파일을 포함하도록 어떻게 말해야 합니까? 나는 커널 Makefile을 살펴보았는데, 나는 그것에 능숙하지 않지만 .S > .o에 대한 규칙이 있는 것 같습니다. 내가 틀렸나요?
답변1
언제나 그렇듯이 RTFM입니다. 이 질문에 답하고 여기에 머물면서 이 문제가 발생할 수 있는 다른 사람들을 도우십시오. Linux Documentation Project에 따르면 obj-m을 잘못 사용하고 있었습니다.
때로는 커널 모듈을 여러 소스 파일로 나누는 것이 합리적입니다. 다음은 그러한 커널 모듈의 예입니다.
[소스 파일...]
마지막으로 메이크파일:
예제 2-10. 파일 생성
obj-m += hello-1.o obj-m += hello-2.o obj-m += hello-3.o obj-m += hello-4.o obj-m += hello-5.o obj-m += startstop.o startstop-objs := start.o stop.o
모두: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 모듈
정리: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
리눅스 커널 모듈 프로그래밍 가이드: 2.7. 여러 파일에 걸쳐 있는 모듈
따라서 내 Makefile은 다음과 같아야 합니다.
obj-m += kexecmod.o kexecmod-objs := kexec.o machine_kexec.o relocate_kernel.o
relocate_kernel.S를 relocate_kernel.o로 컴파일합니다.
(kexec를 모듈로 컴파일하려는 사람에게는 아직 모든 종속성을 찾지 못했지만 시작에 불과합니다.)