問題描述
dpdk-16.04 中的 eal_vfio.h 頭文件中有下面的預處理語句:
#ifdef RTE_EAL_VFIO
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
#include <linux/vfio.h>
在不同的環境上編譯時發現生成的代碼不同。研究了下發現是上面預處理語句中 LINUX_VERSION_CODE
判斷的問題。
分析驗證
驗證不同環境上 RTE_KERNEL
指定的內核目錄下的 linux/version.h
頭文件,發現是相同的。
真正的問題
一開始沒有想到頭文件搜索路徑的問題,最後終於發現庫函數中 linux/version.h
並不是從 RTE_KERNEL
指定的內核源碼路徑中搜索的,而是從編譯機器上的 ```/usr/include/linux`` 目錄搜索的。
對比不同環境上的 /usr/include/linux/version.h
,果然發現了一個機器上的 version.h
版本不對。
這裏的注意事項如下:
- 編譯 dpdk 內核相關 ko 的源文件時 linux/version.h 是從指定的內核路徑下面搜索
- 編譯庫函數時包含的 linux/version.h 頭文件是從編譯系統上的 /usr/include/linux 目錄中搜索的
- 不同機器上的 /usr/include/linux 路徑中的 version.h 可能存在差別