Social Icons

twitterfacebookgoogle plusrss feedemail

4/11/2013

[Beagleboard] 1. 建立ARM嵌入式開發環境(Cross compiler)


利用ARM Cross compiler交叉編譯環境,可以讓我們在x86系統上,編譯ARM處理器上可執行的程式碼。這邊主要用於編譯Beagleboard上的bootloader、kernel image,以及其它ARM可執行程序。

具體步驟如下:


(1)在VMware上創建一個虛擬機,安裝發行版的ubunt​u系統,用於建立ARM嵌入式開發環境。

(2)安裝arm-linux-gcc,建立ARM交叉編譯環境(需要root權限)
    1、下載arm-linux-gcc-4.3.x.tgz壓縮包(請自己挑一個版本)
          ARM-Linux GCC 4.4.3  載點1
          ARM-Linux GCC 4.3.2  MEGA  載點1 載點2 載點3
          (這邊我使用4.3.2)

    2、將壓縮檔自動解壓至/user/local/arm/目錄下。讓ARM交叉編譯器的所有可執行程序都在 /usr/local/arm/4.3.2/bin/ 目錄下
          tar -xzvf arm-linux-gcc-4.3.2.tgz -C /
         -C  某目錄 為解壓縮至某目錄下,詳細請看鳥哥

    3、配置root用戶環境變量,修改/etc/bash.bashrc文件
 #vim ~/.bashrc
          在最後加上,加完之後存檔關閉
PATH=$PATH:/new_path:/another_new_path
export PATH
         更新
#source ~/.bashrc


    4、測試arm-linux-gcc -v,會執行編譯器,正常顯示版本信息表示已安裝配置成功


到這邊已經安裝完成,你電腦裡面已經安裝了arm-linux-gcc了~!

接下來編譯Hello world來試試看吧
# gcc hello.c -o hello
#./a.out
hello,world
#arm-linux-gcc hello.c
#./a.out
bash: ./hello1: cannot execute binary file
因為編譯成arm形式,所以在x86電腦上是不能執行的~(可以專一些模擬器就能執行了,之後再打教學)



***************************************
以下為進階使用
假設我把helloword編譯成兩種不同的格式(如下)

arm-linux-gcc交叉編譯工具的使用
arm-linux-objdump -S -D hello_x86  反匯編指令時,遇到以下提示的錯誤:
arm-linux-objdump: Can't disassemble for architecture UNKNOWN!

原因是:不可以用arm的反邊譯來反邊譯x86的程式,這肯定會出現錯誤

反匯編arm-linux-objdump 使用
# arm-linux-objdump -D -S hello_arm >log
# cat log     // 查看對應的文件如下



arm-linux-readelf 文件查看工具

# arm-linux-readelf -a hello1 >log  
ELF Header:    //主要查看這個頭文件
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian    
  //採用的是小端模式(程序運行不起來,硬件平台是打斷格式,交叉工具鏈是小端格式)
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM    //程序運行在ARM平台上
  Version:                           0x1
  Entry point address:               0x82cc
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2488 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         37
  Section header string table index: 34

# arm-linux-readelf -d hello1  

Dynamic section at offset 0x470 contains 24 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]  
 // 程序所用到的共享鏈接庫(程序運行不起來,可能找不到共享鏈接庫,把所需要的庫考到路徑下)
 0x0000000c (INIT)                       0x8278
 0x0000000d (FINI)                       0x8434
 0x00000019 (INIT_ARRAY)                 0x10464
 0x0000001b (INIT_ARRAYSZ)               4 (bytes)
 0x0000001a (FINI_ARRAY)                 0x10468
 0x0000001c (FINI_ARRAYSZ)               4 (bytes)



沒有留言:

張貼留言

俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!

 
 
无觅相关文章插件,迅速提升网站流量