이 오류 메시지에 대해 걱정해야 합니까?
linux-y3pi:/usr/src/linux-2.6.38.8 # make modules
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
Building modules, stage 2.
MODPOST 2516 modules
***WARNING: modpost: Found 10 section mismatch(es).***
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
답변1
이 SO Q&A의 순수 복사본인 이 질문에 대한 솔루션은 U&L에도 가치가 있습니다!
인용하다
이것은 단지 경고일 뿐입니다. 커널 빌드 시스템이 온전성 검사를 수행하여 잠재적으로 버그가 있는 콘텐츠를 발견했습니다. 경고 메시지는 커널 코드 어딘가에 부적절한 교차 섹션 액세스를 수행할 수 있는 코드가 있음을 나타냅니다. 커널이 실제로 구축되었음을 참고하세요!
이 경고의 의미를 이해하려면 다음 예를 고려하십시오.
커널 텍스트 섹션의 일부 커널 코드는 __init
링커가 커널에 넣는 데이터 매크로로 표시된 함수를 호출하려고 시도할 수 있습니다.내부에시작 또는 모듈 로드 후 할당이 취소된 섹션입니다.
런타임 오류일 수 있습니다.텍스트부분 호출의 코드내부에초기화 코드가 완료된 후에는 기본적으로 오래된 포인터를 호출합니다.
그렇지만 호출은 완벽하게 괜찮을 수 있습니다. 커널에서의 호출은 다음과 같을 수 있습니다.텍스트섹션에는 호출만 수행된다는 사실을 알 만한 충분한 이유가 있습니다.내부에부분, 존재가 보장되는 경우.
물론 이것은 단지 예일 뿐입니다. 다른 유사한 시나리오가 존재합니다.
해결책은 CONFIG_DEBUG_SECTION_MISMATCH=y
어떤 함수가 어떤 데이터나 함수에 액세스하려고 하는지, 그리고 어떤 부분이 속하는지 출력을 제공하는 컴파일입니다. 그런 다음 빌드 시간 경고가 필요한지 판단하고, 그렇다면 수정하시기 바랍니다.
이것초기화 파일매크로를 사용하면 이러한 작업을 수행 __ref
할 수 있습니다 .__refdata
내부에예고 없이 참조하세요. 예를 들어,
char * __init_refok bar(void)
{
static int flag = 0;
static char* rval = NULL;
if(!flag) {
flag = 1;
rval = init_fn(); /* a function discarded after init */
}
return rval;
}
__init_refok
등은 "유효한" 인스턴스를 수정하여 해당 인스턴스가 존재한다는 사실을 수정할 수 있습니다.가능한자신감을 불러일으키지 않습니다.