利用ARM Cross compiler交叉編譯環境,可以讓我們在x86系統上,編譯ARM處理器上可執行的程式碼。這邊主要用於編譯Beagleboard上的bootloader、kernel image,以及其它ARM可執行程序。
具體步驟如下:
(1)在VMware上創建一個虛擬機,安裝發行版的ubuntu系統,用於建立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因為編譯成arm形式,所以在x86電腦上是不能執行的~(可以專一些模擬器就能執行了,之後再打教學)
#./a.out
hello,world
#arm-linux-gcc hello.c
#./a.out
bash: ./hello1: cannot execute binary file
***************************************
以下為進階使用
假設我把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
看過文章之後歡迎留下您寶貴的意見喔!