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