Cópia pura deste SO Q & A, Uma solução para esta questão é valiosa para a U & L também!
Referência
Isto é 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 no código do kernel, há código que pode fazer o acesso de seção cruzada inadequado. Observe que seu kernel foi criado!
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 macro __init
data, que o linker coloca na seção do kernel init que é desalocada após a inicialização ou carregamento de módulos.
Isso pode ser um erro de tempo de execução, pois se o código na seção texto chamar o código na seção init depois que o código de inicialização tiver terminado, ele será basicamente chamado um ponteiro obsoleto.
Dito isto, essa chamada pode estar perfeitamente bem - é possível que as chamadas na seção do kernel texto tenham uma boa razão para saber que ele só chama a função no init seção quando é garantido para estar lá.Isso, claro, é apenas um exemplo. Outros cenários semelhantes também existem.
A solução é compilar com CONFIG_DEBUG_SECTION_MISMATCH=y
, que lhe dará 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 compilação é necessário e, se for o caso, consertar.
O init.h macros __ref
e __refdata
podem ser usados para permitir tais referências init 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, pode corrigir instâncias "válidas", portanto, o fato de existir pode não inspirar confiança.