AVISO: modpost: Encontrado 10 incompatibilidade de seção (s)

6

Esta mensagem de erro é algo com o qual eu deveria estar preocupado?

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'
    
por Aquarius_Girl 08.06.2012 / 07:12

1 resposta

1

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.

    
por 21.09.2013 / 16:58