임베디드 시스템용 커널과 모듈을 구축하는 데 문제가 있습니다. 생성된 Module.symvers에는 유효하지 않은(0x00000000) CRC 항목을 포함하는 일부(수십) 개의 항목이 있습니다.
문제가 되는 항목 디버깅을 시작할 수 있도록 Module.symvers를 생성하는 프로세스를 파악하려고 합니다. 하지만 몇 시간 동안 빌드 과정을 지켜본 후에도 여전히 무엇을 이해하지 못합니다.생산하다module.symvers.
참고 - "모듈 만들기" 지침이 아니라 실제로 Module.symvers의 내용을 생성하는 코드를 찾고 있습니다 ;-)
GCC 6.3을 사용하여 Linux 3.4.12를 빌드함으로써 손상이 발생한 것으로 의심되지만 해당 구성을 사용하려면 이를 가져와야 합니다. 타사 바이너리 Blob 모듈을 로드해야 하므로 Modvers를 비활성화하는 것은 옵션이 아닙니다.
답변1
이 파일 Module.symvers
은 scripts/modpost
. 처음에 댓글 보세요Makefile.modpost, 중간에 있는 사람들빌드 파일.빌드, 그리고 프로그램 자체modpost.c이는 options 을 사용하여 실행됩니다 -m -i
.
를 사용하면 make modules KBUILD_VERBOSE=1
사용 중인 명령을 볼 수 있습니다.
답변2
생성하는 데는 Module.symvers
여러 단계가 있습니다 . 이 단계에서는 포함 파일 MODVERDIR
(일반적으로 .tmp_versions
빌드 디렉터리에 있음) 을 활용합니다..mod
모듈을 컴파일하고 .o
해당 파일을 생성한 후 소스 코드는 C 전처리기를 통해 푸시되고 -D__GENKSYMS__
결과 출력은 자체(상대적으로 간단한) 코드 파서를 scripts/genksyms
구현 genksyms
하여 기호 서명과 해당 CRC를 생성하도록 파이프됩니다. genksyms
커널 3.4에서 gcc 6.3을 사용할 때 소스 코드가 올바르게 구문 분석되지 않는 것은 이 구문 분석기의 제한 사항입니다 . (커널 4.12를 백포팅하여 문제를 해결했습니다 genksyms
.) 모든 기호 CRC를 포함하는 파일이 genksyms
각 모듈에 대해 생성됩니다 . 그런 다음 컴파일되어 파일을 .mod.c
생성합니다 ..mod.o
마지막 단계에는 모듈 *.mod
의 모든 파일을 구문 분석하고 MODVERDIR
, 모듈을 구성하는 모든 파일을 확인하고 , .ko
해당 .mod.o
파일 목록을 와 함께 vmlinux
전달하는 작업이 포함됩니다 scripts/modpost
. scripts/modposts
대상 파일을 구문 분석하고 Module.symvers
.