天天看點

ipmitool在arm上的移植

目标:在主控端上交叉編譯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上使用了.

ipmitool在arm上的移植
ipmitool在arm上的移植

.