
이 오류 메시지가 걱정해야 할 부분입니까?
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
어떤 기능이 어떤 데이터나 기능에 액세스하려고 하는지, 그리고 어떤 섹션에 속하는지에 대한 출력을 제공하는 컴파일입니다. 그런 다음 빌드 시간 경고가 정당한지 확인하고 그렇다면 수정을 시도할 수 있습니다.
그만큼초기화.h매크로를 사용 __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
등은 "유효한" 인스턴스를 수정할 수 있으므로 해당 인스턴스가 존재한다는 사실을5월자신감을 불러일으키지 마세요.