目标:在主控端上交叉編譯ipmitool,使其能夠在ARM上能夠運作.
環境:
1. 主控端:ubuntu+arm-linux-gcc
2.目标機:mini2440
源碼:
1. readline源碼
2. ncurses源碼
3. ipmitool源碼
本文主要包括兩個部分:ipmitool的交叉編譯和編譯好ipmitool在mini2440闆上運作問題解決.
我先介紹本文的第一部分:ipmitool的交叉編譯,因為ipmitool的交叉編譯過程中需要ncurses和readline庫和頭檔案的支援,是以了,我們先要把ncurses和readline編譯好庫和頭檔案拷貝到arm-linux-gcc預設搜尋的頭檔案和庫檔案的目錄,然後交叉編譯ipmitool.
注意了:
1. readline和ncurses一定要交叉編譯,因為我們交叉編譯ipmitool,此時編譯連結的庫要交叉編譯好的庫和頭檔案.
2.交叉編譯好的庫檔案和頭檔案移動要存放到arm-linux-gcc預設搜尋的頭檔案和庫檔案的目錄,而不是gccc預設搜尋的頭檔案和庫檔案的目錄.
不說多少了,直接上過程.
1. readline交叉編譯
1) 解壓readline源碼.
2)切換到readline的跟目錄,執行下面指令: ./configure --prefix=/opt/readline --host=arm-linux CC=arm-linux-gcc
說明:configure是為了生成makefile檔案,--prefix指定生成檔案的目錄,--host指定生成庫和指令運作的平台,CC指定交叉工具鍊.
敲下指令,卻沒有成功的執行下去,報錯,報錯如下:
Checking for mbstate_t ... configure: error: cannot run test program while cross compiling
解決辦法:
首先在configure檔案中找到包含mbstate_t字串的字元串,打開configure檔案:
....
echo "$as_me:4840:checking for mbstate_t" >&5
echo $ECHO_N "checking for mbstate_t ... $ECHO_C" >&6
if test "${bash_CV_have_mbstate_t +set}" =set; then
....
然後直接在終端輸入:
1. echo bash_cv_have_mbstate_t =yes > arm-linux.cache
2. ./configure --prefix=/opt/readline --host=arm-linux CC=arm-linux-gcc cache-file=arm-linux.cache
3)make install
2.ncurses交叉編譯
1) 解壓ncurses源碼.
2)切換到ncurses的跟目錄,執行下面指令: ./configure --prefix=/opt/ncurses--host=arm-linux CC=arm-linux-gcc
這樣在/opt目錄下,會有兩個目錄:readline和ncurses,這兩個目錄下分别有:include,info,lib和man.include包含有頭檔案,lib包含有庫檔案.需要将readline和ncurses交叉編譯好的頭檔案和庫檔案拷貝到arm-linux-gcc預設搜尋的頭檔案和庫檔案的目錄.
我的arm-linux-gcc預設的頭檔案和庫檔案的搜尋路徑:
1. 頭檔案路徑:
/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/include
2. 庫檔案路徑
/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
然後在終端中執行如下指令咯:
cp /opt/readline/include/* /opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/include
cp /opt/ncurses/include/* /opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/include
cp /opt/readline/lib/* /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
cp /opt/ncurses/lib/* /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
注:當然也可以在交叉編譯ipmitool時候,指定頭檔案和庫檔案搜尋路徑,我是選擇直接把頭檔案和庫檔案放到交叉編譯工具鍊預設搜尋路徑.
3. ipmitool的交叉編譯
1) 解壓ipmitool源碼.
2)切換到ncurses的跟目錄,執行下面指令: ./configure --prefix=/opt/ipmitool--host=arm-linux CC=arm-linux-gcc
3)執行如下指令:make install
然後把/opt/ipmitool/bin下的ipmitool,拷貝到mini2440開發闆中運作.
說明:
如果編譯ipmitool報如下錯誤:
configure: error: **Unable to find curses required by ipmishell.
錯誤提示:找不到ncurese庫.
錯誤原因:
1. 你沒有交叉編譯ncurses和readline.
2.你交叉編譯了ncurses和readline沒有把頭檔案和庫檔案放到交叉編譯器預設搜尋路徑.
下面要講的是本文的第二部分編譯好ipmitool在mini2440闆上運作問題解決.
把ipmitool編譯好的bin(/opt/ipmitool/bin/ipmitool)檔案拷貝到mini2440中運作,運作會報如下錯誤:
./ipmitool: error while loading shared libraries: libreadline.so.4 : cannot open shared object file:No such file or directory.
提示:mini2440缺少readline庫,
解決辦法:直接把readline和ncurses的庫,拷貝到mini2440中/usr/lib(這是系統預設連結的庫,也就是gcc搜尋的庫)中.
接着執行,繼續報錯:
./ipmitool:error while loading shared libraries: /usr/bin/libreadline.so.4 : file too short.
解決辦法:
1. ls /usr/lib/libreadline*
libreadline.so.4
libreadline.so.4.3
2. rm -rf libreadline.so.4
3. ln -s libreadline.so.4.3 libreadline.so.4
同樣的道理适用于libncurses.
經過上面的步驟,ipmitool可以成功在arm上使用了.
.