Это всего лишь предупреждение. Системы сборки ядра провели проверку работоспособности и обнаружили что-то, что может быть ошибкой. В предупреждающем сообщении говорится, что где-то в коде ядра есть код, который может сделать неправильный доступ к сечению. Обратите внимание, что ваше ядро собралось!
Чтобы понять, что означает предупреждение, рассмотрим следующий пример:
Некоторый код ядра в текстовом разделе ядра может пытаться вызвать функцию, отмеченную макросом данных __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
и т. Д. Могут исправить «действительные» экземпляры, поэтому факт их существования может не внушать доверия.