.png)
Esta mensagem de erro é algo com que devo me preocupar?
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'
Responder1
Cópia pura deste SO Q&A. Uma solução para esta questão também é valiosa para a U&L!
Referência
Este é apenas um aviso. Os sistemas de compilação do kernel fizeram uma verificação de integridade e descobriram algo que pode ser um erro. A mensagem de aviso diz que em algum lugar do código do kernel existe um código que pode fazer acesso inadequado à seção cruzada. Observe que seu kernel foi compilado!
Para entender o que o aviso significa, considere o seguinte exemplo:
Algum código do kernel na seção de texto do kernel pode estar tentando chamar uma função marcada com a __init
macro de dados, que o vinculador coloca no kerneliniciarseção que é desalocada após a inicialização ou carregamento do módulo.
Isso pode ser um erro em tempo de execução, pois se o código notextoseção chama o código noiniciarseção após a conclusão do código de inicialização, ele basicamente está chamando um ponteiro obsoleto.
Dito isto, essa chamada pode estar perfeitamente correta - é possível que as chamadas no kerneltextoseção tem algum bom motivo para saber que ela apenas chama a função noiniciarseção quando é garantido que estará lá.
Isto, claro, é apenas um exemplo. Também existem outros cenários semelhantes.
A solução é compilar com CONFIG_DEBUG_SECTION_MISMATCH=y
o qual você obterá a saída de qual função está tentando acessar quais dados ou função e a qual seção eles pertencem. Você pode então tentar descobrir se o aviso de tempo de construção é garantido e, em caso afirmativo, corrigi-lo.
Oiniciar.hmacros __ref
e __refdata
pode ser usado para permitir taliniciarreferências sem avisos. Por exemplo,
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
, etc podem corrigir instâncias "válidas", então o fato de elas existirempoderianão inspirar confiança.