Ядро Linux CONFIG_DEBUG_SECTION_MISMATCH делает ошибки

Во время "make" этапа компиляции ядра Linux я получаю много таких ошибок:

Building modules, stage 2.
MODPOST 2283 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'

Я знаю, что могу просто сделать make CONFIG_DEBUG_SECTION_MISMATCH= y и продолжить с ним, но я хочу знать, есть ли лучший способ справиться с этим. Может быть, сообщить кому-то или как я сам исправляю эти проблемы и т.д.

Ответы

Ответ 1

Это просто предупреждение. Системы сборки ядра проверили проверку работоспособности и обнаружили ошибку, которая может быть ошибкой. В предупреждающем сообщении говорится, что где-то в коде ядра есть код, который может привести к несоответствующему доступу по сечениям. Обратите внимание, что ваше ядро ​​построило!

Чтобы понять, что означает предупреждение, рассмотрим следующий пример:

Некоторый код ядра в текстовом разделе ядра может пытаться вызвать функцию, помеченную макросом данных __init, который компоновщик помещает в секцию инициализации ядра, которая получает выделение после загрузки или загрузки модуля.

Это может быть ошибка времени выполнения, поскольку, если код в текстовом разделе вызывает код в секции инициализации после завершения кода инициализации, он в основном вызывает устаревший указатель.

Сказав это, этот вызов может быть совершенно точным - возможно, что вызовы в текстовом разделе ядра имеют веские основания знать, что он вызывает функцию только в секции инициализации, когда она, как гарантируется, будет там.

Это, конечно, просто пример. Аналогичные другие сценарии также существуют.

Решение заключается в компиляции с CONFIG_DEBUG_SECTION_MISMATCH=y, который даст вам выход какой функции пытается получить доступ к данным или функции и к какому разделу они принадлежат. Затем вы можете попытаться выяснить, оправдано ли предупреждение о времени сборки и, если так, надеюсь, исправить.

init.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 и т.д. могут исправить "действительные" экземпляры, поэтому тот факт, что они существуют, может не внушать доверия.