
我應該擔心此錯誤訊息嗎?
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
資料巨集的函數,連結器將其放入核心中在裡面啟動或模組載入後被取消分配的部分。
這可能是運行時錯誤,因為如果文字部分調用中的程式碼在裡面初始化程式碼完成後的部分,它基本上是呼叫一個過時的指標。
話雖如此,該呼叫可能完全沒問題 - 核心中的呼叫可能是這樣文字部分有充分的理由知道它只調用在裡面部分,當它保證存在時。
當然,這只是一個例子。類似的其他場景也存在。
解決方案是使用CONFIG_DEBUG_SECTION_MISMATCH=y
which 進行編譯,將為您提供哪個函數試圖存取哪個資料或函數以及它們屬於哪個部分的輸出。然後,您可以嘗試確定建置時間警告是否有必要,如果是的話,希望能夠修復。
這初始化檔案巨集__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
等可以修復“有效”實例,因此它們存在的事實可能不能激發信心。