歡迎您光臨本站 註冊首頁

iscsitarget-0.4.15在2.6.24內核下編譯錯誤問題匯總及解決辦法

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

平台說明:我使用的linux是FC8,內核版本是2.6.23。但是考慮到iscsitarget對內核有特殊要求,我重新編譯了一個2.6.24的內核。

2.6.24內核在/home/lianxi1999/linux-2.6.24下編譯的。iscsitarget-0.4.15需要對內核進行修改,所以在編譯過程中需要root許可權。源文件存放在/home/lianxi1999/iscsitarget-0.4.15/中。開始我是在2.6.24內核下編譯的,在編譯的過程可謂是困難重重!

第一個錯誤:
make[1]: Entering directory `/home/lianxi1999/linux-2.6.24'
CC [M] /home/lianxi1999/iscsitarget-0.4.15/kernel/tio.o
/home/lianxi1999/iscsitarget-0.4.15/kernel/tio.c: In function 『tio_init』:
/home/lianxi1999/iscsitarget-0.4.15/kernel/tio.c:114: 錯誤:提供給函數'kmem_cache_create』 的實參太多
make[2]: *** [/home/lianxi1999/iscsitarget-0.4.15/kernel/tio.o] 錯誤 1
make[1]: *** [_module_/home/lianxi1999/iscsitarget-0.4.15/kernel] 錯誤 2
make[1]: Leaving directory `/home/lianxi1999/linux-2.6.24' make: *** [kernel] 錯誤 2

通過錯誤提示可以看出,tio.c在調用函數kmem_cache_create時,給它傳遞的參數太多!找到tio.c中的調用語句:tio_cache = kmem_cache_create("tio", sizeof(struct tio),0, 0, NULL, NULL); 通過網路查找和查閱內核開發方面的書籍,發現內核函數 kmem_cache_create 用來創建一個新緩存。這通常是在內核初始化時執行的,或者在首次載入內核模塊時執行。

其原型定義如下: struct kmem_cache * kmem_cache_create( const char *name, size_t size,
size_t align, unsigned long flags;
void (*ctor)(void*, struct kmem_cache *, unsigned long),
void (*dtor)(void*, struct kmem_cache *, unsigned long));

通過函數原型發現該函數確實是六個參數。到底怎麼回事呢?看來只能通過查找內核源碼來解決問題了!找到定義該函數的源文件:/home/lianxi1999/linux-2.6.24/include/linux/slab.h 發現函數原型為:

struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, unsigned long,
void (*)(struct kmem_cache *, void *));

很明顯,在新版本的內核里,該函數定義發生了變化!找到了問題的所在!(實際上,該函數的定義在2.6.23中就修改了)趕緊根據提示修改程序中調用該函數的地方吧!把所有調用該函數的最後一個參數都去掉,再次編譯,成功通過!不過又出現了新的錯誤!

第二個錯誤: /root/iscsitarget-0.4.15/kernel/digest.c: In function 『digest_header』:
/root/iscsitarget-0.4.15/kernel/digest.c:185: 錯誤:『struct scatterlist』 沒有名 為 『page』 的成員
/root/iscsitarget-0.4.15/kernel/digest.c:187: 錯誤:『struct scatterlist』 沒有名 為 『page』 的成員
/root/iscsitarget-0.4.15/kernel/digest.c: In function 『digest_data』: /root/iscsitarget-0.4.15/kernel/digest.c:239: 錯誤:『struct scatterlist』 沒有名 為 『page』 的成員
make[2]: *** [/root/iscsitarget-0.4.15/kernel/digest.o] 錯誤 1
make[1]: *** [_module_/root/iscsitarget-0.4.15/kernel] 錯誤 2
make[1]: Leaving directory `/home/lianxi1999/linux-2.6.24' make: *** [kernel] 錯誤 2

這個錯誤比前一個更奇怪了!竟然使用了結構體沒有的成員!還是跟第一次一樣的順序,通過上網和查書,發現struct scatterlist的定義如下:

struct scatterlist { struct page *page; unsigned int offset; dma_addr_t dma_address; unsigned int length; };

很明顯,有page成員變數。那是怎麼回事呢?看來還是老一套,查找內核源碼!digest.c中包含的頭文件是 打開內核中的這個文件,發現它的內容如下:

#ifdef CONFIG_X86_32
# include "scatterlist_32.h"
#else
# include "scatterlist_64.h"
#endif

我用的是32位的平台,只能去找scatterlist_32.h,還好這兩個文件離的很近(很方便查找)。發現在2.6.24內核中該結構體的定義如下:

struct scatterlist { #ifdef CONFIG_DEBUG_SG unsigned long sg_magic; #endif unsigned long page_link; unsigned int offset; dma_addr_t dma_address; unsigned int length; };

果然沒有page成員(!_!)這該怎麼辦啊!好像已經山窮水盡了,這是我想到了我的系統中還有一個2.6.23的內核。趕快找到它對這個struct的定義,哈哈,天無絕人之路!竟然是和老版本的定義一樣!快點切過去吧。在2.6.23下果然沒有了這個問題。但是新的問題又來了,真是鬱悶阿。

幹了上面這些事情,已經用了半天的時間,第三個問題待續吧

第三個問題:
/root/iscsitarget-0.4.15/kernel/event.c: In function 『event_init』:
/root/iscsitarget-0.4.15/kernel/event.c:98: 警告:傳遞參數 4 (屬於 『netlink_kernel_create』)時在不兼容的指針類型間轉換
/root/iscsitarget-0.4.15/kernel/event.c:98: 錯誤:提供給函數 『netlink_kernel_create』 的實參太少
make[2]: *** [/root/iscsitarget-0.4.15/kernel/event.o] 錯誤 1
make[1]: *** [_module_/root/iscsitarget-0.4.15/kernel] 錯誤 2
make[1]: Leaving directory `/usr/src/kernels/2.6.23.1-42.fc8-i686' make: *** [kernel] 錯誤 2

很明顯這是netlink_kernel_create函數在新版本的內核中被重新定義了。

找到event.c中調用該函數的語句:nl = netlink_kernel_create(NETLINK_IET, 1, event_recv, THIS_MODULE);

這下我聰明了,一開始想就通過頭文件找到該該函數的定義。可是我找了該文件包含的所有的頭文件之後,還是沒有找到這個函數的文件,有點失望了!還是找百度吧……還好,找到了,這個函數定義在linux/netlink.h中。終於找到了,哈哈。看看吧:

extern struct sock *netlink_kernel_create(int unit, unsigned int groups, void (*input)(struct sock *sk, int len), struct mutex *cb_mutex, struct module *module);

原型中定義了5個參數,而調用的時候只傳遞了4個。怎麼辦呢?通過觀察,發現是第四個形參沒有傳遞,網上的做法是把它置為NULL,我就照做了^_^。順利過關!OYEAR! 修改以上三個錯誤以後,make->make install->start。OK,可以啟動了!

[火星人 ] iscsitarget-0.4.15在2.6.24內核下編譯錯誤問題匯總及解決辦法已經有389次圍觀

http://coctec.com/docs/linux/show-post-187149.html