
Стоит ли мне беспокоиться из-за этого сообщения об ошибке?
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'
решение1
Чистая копия из этого SO Q&A. Решение этого вопроса также представляет ценность для U&L!
Ссылка
Это всего лишь предупреждение. Системы сборки ядра провели проверку работоспособности и обнаружили что-то, что может быть ошибкой. Предупреждающее сообщение говорит о том, что где-то в коде ядра есть код, который может выполнять ненадлежащий доступ к перекрестным секциям. Обратите внимание, что ваше ядро было собрано!
Чтобы понять, что означает это предупреждение, рассмотрим следующий пример:
Часть кода ядра в текстовом разделе ядра может пытаться вызвать функцию, отмеченную макросом __init
data, который компоновщик помещает в ядро.в этомраздел, который освобождается после загрузки или загрузки модуля.
Это может быть ошибкой времени выполнения, поскольку если код втекстраздел вызывает код вв этомраздел после завершения кода инициализации, по сути, вызывается устаревший указатель.
Тем не менее, этот вызов может быть совершенно нормальным - возможно, что вызовы в ядретекстраздел имеет некоторые веские причины знать, что он вызывает только функцию вв этомраздел, когда он гарантированно там будет.
Это, конечно, всего лишь пример. Существуют и другие подобные сценарии.
Решение состоит в том, чтобы скомпилировать с CONFIG_DEBUG_SECTION_MISMATCH=y
which, который даст вам вывод того, какая функция пытается получить доступ к каким данным или функции и к какому разделу они принадлежат. Затем вы можете попытаться выяснить, оправдано ли предупреждение времени сборки, и если да, то, надеюсь, исправить.
Theинициализация.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
и т. д. могут исправить «действительные» экземпляры, поэтому сам факт их существованияможетне внушают доверия.