Ядро Linux CONFIG_DEBUG_SECTION_MISMATCH делает ошибки - PullRequest
15 голосов
/ 24 июля 2011

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

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

1 Ответ

29 голосов
/ 24 июля 2011

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

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

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

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

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

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

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

Макросы init.h __ref и __refdata могут использоваться для разрешения таких ссылок init без предупреждений. Например,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...