Module.symvers를 사용하지 않고 Linux 커널 모듈 컴파일

Module.symvers를 사용하지 않고 Linux 커널 모듈 컴파일

이 임베디드 Linux 장치가 있습니다. 여기에 커널 수준의 기능을 추가하고 싶지만 이를 위해 자체 커널을 컴파일하고 싶지는 않습니다. (커널이 로드되지 않고 사용자 공간에 들어가면 장치가 브릭됩니다. 부트로더에 액세스하여 복원할 수 없습니다. 현재 커널에는 kexec 지원이 없으므로 이를 사용하여 자체 커널 이미지를 테스트할 수 없습니다.)

장치의 커널은 모듈을 지원하지만 해당 Module.symvers 파일의 복사본이 없습니다.

내 질문: Linux 커널용 Module.symvers 파일은 없지만 커널 이미지와 이를 위해 컴파일된 모듈이 있는 경우 누락된 모듈을 생성하여 해당 커널에 연결할 수 있는 더 많은 모듈을 컴파일할 수 있습니까? Symvers 파일, 무엇이 필요합니까?

장치는 Linux 커널 버전 3.10을 실행합니다.
커널 이미지(uImage 컨테이너에 있음):https://www.olio.watch/olio-firmware-1.10.220/olio-firmware/uImage
구성(CONFIG_IKCONFIG를 통해 위 이미지에서 추출됨):https://www.olio.watch/3.10.0-g2ae2f33-config
이 커널과 일치하는 커널 모듈이 있습니다.https://www.olio.watch/olio-firmware-1.10.220/olio-firmware/drv2605.ko

답변1

먼저 "Module.symvers 없이 Linux 커널 모듈을 컴파일할 수 있습니까?"라는 질문에 대답하려면 다음의 목적이 무엇인지 이해해야 합니다 Module.symvers.

Module.symvers두 가지 주요 목적이 있습니다:

1) vmlinux 및 모든 모듈에 대해 내보낸 모든 기호를 나열합니다.

CONFIG_MODVERSIONS2) 활성화된 경우 CRC를 나열합니다. 활성화 되지 않은 경우 CONFIG_MODVERSIONSCRC는 0x00000000을 읽습니다.

Module.symvers커널 빌드 중에 생성되며 커널 및 컴파일된 모듈에서 내보낸 모든 기호가 포함됩니다. 각 기호에 대해 해당 CRC 값도 저장됩니다. Module.symvers 파일의 구문은 다음과 같습니다.

    <CRC>       <Symbol>           <module>

예를 들어:

    0x2d036834  scsi_remove_host   drivers/scsi/scsi_mod

그렇긴 하지만, 우리가 가지고 있다면 Module.symvers필요한 모든 기호가 포함되어 있기 때문에 어떤 모듈이든 만들 수 있습니다.

사용할 수 없는 경우에도 Module.symvers 이 파일을 빌드하거나 다른 모듈에서 빌려 외부 모듈을 빌드할 수 있습니다.

일반적으로 외부 모듈을 빌드할 때 빌드 시스템은 모든 외부 기호가 정의되었는지 확인하기 위해 커널의 기호에 액세스해야 합니다. 이는 이름이 지정된 빌드 단계에서 수행됩니다 MODPOST. 이 단계에서는 Module.symvers커널 소스 트리에서 읽어 기호를 얻습니다.

Module.symvers외부 모듈이 빌드되는 디렉터리에 파일이 있으면 해당 파일도 읽습니다 . 이 단계에서는 커널에 정의되지 않은 모든 내보낸 기호를 포함하는 MODPOST새 파일이 작성됩니다 .Module.symvers

Module.symvers파일이 존재하지 않는 경우 외부 모듈은 다른 외부 모듈에서 내보낸 기호를 사용하고 있을 수 있으며, kbuild정의되지 않은 기호에 대한 경고를 방지하려면 모든 기호를 완전히 이해해야 합니다.

이러한 상황에는 세 가지 해결 방법이 있습니다.

1) 최상위 kbuild파일 사용: 두 개의 모듈이 있고 foo.ko의 기호가 필요한 bar.ko경우 두 모듈이 동일한 버전에서 컴파일되도록 공통 최상위 파일을 사용할 수 있습니다 . 다음 디렉터리 레이아웃을 고려하세요.foo.kobar.kokbuild

    ./foo/ <= contains foo.ko
    ./bar/ <= contains bar.ko

    The top-level kbuild file would then look like:

    #./Kbuild (or ./Makefile):
        obj-y := foo/ bar/

    And executing

        $ make -C $KDIR M=$PWD

    will then do the expected and compile both modules with
    full knowledge of symbols from either module.

2) 추가 Module.symvers파일 사용: 외부 모듈을 빌드할 때 Module.symvers커널에 정의되지 않은 모든 내보낸 기호를 포함하는 파일이 생성됩니다. 의 기호에 액세스하려면 bar.kobar.ko 빌드의 Module.symvers 파일을 foo.ko가 빌드된 디렉터리로 복사하세요. 모듈을 빌드하는 동안 외부 모듈 디렉터리의 파일을 kbuild읽고 , 빌드가 완료된 후 커널의 일부가 아닌 정의된 모든 기호의 합계를 포함하는 새 파일이 생성됩니다.Module.symversModule.symvers

3) "make" 변수 사용 : 다른 모듈에서 복사하는 것이 실용적이지 않은 경우 KBUILD_EXTRA_SYMBOLS빌드 파일에 Module.symvers공백으로 구분된 파일 목록을 할당 할 수 있습니다. 이러한 파일은 기호 테이블을 초기화하는 동안 로드됩니다 KBUILD_EXTRA_SYMBOLS.modpost

자세한 내용은1

관련 정보