
Ist diese Fehlermeldung ein Grund zur Sorge für mich?
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'
Antwort1
Reine Kopie dieses SO Q&A. Eine Lösung dieser Frage ist auch für U&L wertvoll!
Referenz
Dies ist nur eine Warnung. Die Kernel-Build-Systeme haben eine Plausibilitätsprüfung durchgeführt und etwas herausgefunden, das ein Fehler sein könnte. Die Warnmeldung besagt, dass sich irgendwo im Kernel-Code Code befindet, der möglicherweise einen unzulässigen Querschnittszugriff ausführt. Beachten Sie, dass Ihr Kernel erstellt wurde!
Um zu verstehen, was die Warnung bedeutet, betrachten Sie das folgende Beispiel:
Ein Teil des Kernel-Codes im Kernel-Textabschnitt versucht möglicherweise, eine Funktion aufzurufen, die mit dem __init
Datenmakro gekennzeichnet ist, das der Linker in den Kernel einfügtdrinAbschnitt, der nach dem Booten oder Laden des Moduls freigegeben wird.
Dies könnte ein Laufzeitfehler sein, da der Code in derTextruft den Code imdrinAbschnitt, nachdem der Initialisierungscode abgeschlossen ist, ruft er grundsätzlich einen veralteten Zeiger auf.
Allerdings kann dieser Aufruf vollkommen in Ordnung sein - es ist möglich, dass die Aufrufe im KernelTextAbschnitt hat einen guten Grund zu wissen, dass es nur die Funktion in derdrinAbschnitt, wenn seine Anwesenheit garantiert ist.
Dies ist natürlich nur ein Beispiel. Es gibt auch andere ähnliche Szenarien.
Die Lösung besteht darin, mit zu kompilieren. CONFIG_DEBUG_SECTION_MISMATCH=y
Dadurch erhalten Sie eine Ausgabe, die angibt, welche Funktion versucht, auf welche Daten oder Funktionen zuzugreifen und zu welchem Abschnitt sie gehören. Sie können dann versuchen, herauszufinden, ob die Build-Time-Warnung gerechtfertigt ist, und sie ggf. beheben.
Derinit.hMakros __ref
und __refdata
können verwendet werden, um solchedrinReferenzen ohne Warnungen. Beispielsweise
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
, etc. können "gültige" Instanzen reparieren, also die Tatsache, dass sie existierenMaikein Vertrauen erwecken.