커널 헤더에 대해 kgdboe를 빌드할 수 없습니다.

커널 헤더에 대해 kgdboe를 빌드할 수 없습니다.

다음을 기반으로 kgdboe를 구축하려고합니다.지도 시간. 기본 커널에서 사용할 수 없는 드라이버가 필요하기 때문에 업데이트된 커널 5.9.0으로 Ubuntu 20.04를 실행하고 있습니다. 헤더, 모듈 및 커널 이미지 .deb 패키지를 다운로드하고 수동으로 설치하여 커널을 업데이트했습니다. 내 uname -r출력은 입니다 5.9.0-050900-generic. 빌드 모듈을 사용하려고 하면 make -C /lib/modules/$(uname -r)/build M=$(pwd)오류가 발생합니다.

ERROR: modpost: "__module_address" [/home/ipc/Downloads/kgdboe/kgdboe.ko] undefined!

또한 GIT에서 전체 Linux 커널 소스 트리를 수동으로 다운로드하고 5.9.0을 확인했습니다. 전체 소스 트리에 대한 경로를 사용하여 make 명령에서 이 모듈을 생성하면 모듈이 빌드됩니다. 그러나 모듈 매직 버전과 uname -r 출력이 일치하지 않기 때문에 modprobe -f.

제 질문은 왜 Linux 헤더로 빌드할 수 없느냐는 것입니다. 모듈 구축을 위한 헤더 폴더를 준비하는 몇 가지 단계가 누락되었습니까? 커널 헤더에 대해 이 모듈을 빌드하는 방법이나 uname -r출력 에 대한 빌드 모듈(5.9.0)의 버전 매직을 업데이트할 수 있는 방법을 찾으려고 노력 중입니다 .

답변1

(편집이 부실해서 죄송합니다)

KGBoE는 Linux 커널 > v5.7.0과 호환되지 않습니다(참조:협회). KGDBoE가 제대로 작동하려면 다음과 같이 Linux 커널과 KGDBoE 소스 코드를 패치해야 했습니다.

  1. 최근 커널 버전에서 내보내지지 않은 커널의 누락된 기호를 다시 내보냅니다.

diff --git a/kernel/kallsyms.cb/kernel/kallsyms.c

index 4fb15fa96734..4669f3cfb55b 100644
--- a/kernel/kallsyms.c

+++ b/kernel/kallsyms.c
@@ -176,6 +176,7 @@ unsigned long kallsyms_lookup_name(const char *name)
        }
        return module_kallsyms_lookup_name(name);
 }
+EXPORT_SYMBOL_GPL(kallsyms_lookup_name);
 int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
                                      unsigned long),
diff --git a/kernel/module.c b/kernel/module.c
index 1c5cff34d9f2..cd07a842bdb2 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -4517,7 +4517,7 @@ struct module *__module_address(unsigned long addr)
        }
        return mod;
 }
-
+EXPORT_SYMBOL_GPL(__module_address);
  1. 다음을 주석 처리하여 KGDBoE 모듈 매개변수 kallsyms_lookup_name_address를 비활성화합니다.

    kgdboe_main.c 파일에서

    //uint64_t kallsyms_lookup_name_address; //module_param(kallsyms_lookup_name_address, ullong, 0444);

    static int __init kgdboe_init(void) { // if (!kallsyms_lookup_name_address) // { // printk(KERN_ERR "kgdboe: 이 커널 버전에서는 kallsyms_lookup_name의 주소를 명시적으로 지정해야 합니다. 'kallsyms_lookup_name_address=0x...를 추가하세요. insmod 명령. 'Linen'); // -EINVAL을 반환합니다.

    Tracewrapper.h 파일에서: //extern uint64_t kallsyms_lookup_name_address; //#define kallsyms_lookup_name ((unsigned long(*)(const char *))kallsyms_lookup_name_address)

관련 정보