AVISO: modpost: Encontradas 10 incompatibilidades de seção(s)

AVISO: modpost: Encontradas 10 incompatibilidades de seção(s)

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 __initmacro 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=yo 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 __refe __refdatapode 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.

informação relacionada