1、交叉編譯工具
arm-linux-gcc arm-linux-addr2line arm-linux-objcopy arm-linux-readelf arm-linux-ar arm-linux-ld arm-linux-objdump arm-linux-size arm-linux-nm arm-linux-strip arm-linux-cc arm-linux-gprof arm-linux-c++filt arm-linux-as arm-linux-cpp arm-linux-gccbug arm-linux-ldd arm-linux-populate arm-linux-strings arm-linux-c++ arm-linux-g++ arm-linux-gcov arm-linux-ranlib |
如何檢視各交叉編譯工具的幫助資訊:
例如檢視arm-linux-gcc的幫助資訊:
$ arm-linux-gcc --help
常用的交叉編譯工具:
1.1 交叉編譯器 arm-linux-gcc
和X86平台下的gcc的基本用法用法是完全一樣的;不同之處:标準的gcc所引用的頭檔案路徑為 /usr/include/stdio.h,arm-linux-gcc所引用的頭檔案路徑為其安裝路徑下,如 /usr/local/armtools/4.5.1/bin/..
1.2 交叉連結器 arm-linux-ld
arm-linux-ld指令是ARM平台下的交叉連結器,把程式連結成可以在ARM平台下運作。
用法: arm-linux-ld -Tled.lds led.o -o led.elf
把led.o連結成led.elf檔案;led.lds是連結器腳本,
1.3 交叉elf檔案工具 arm-linux-readelf
檢視.elf格式檔案: arm-linux-readelf -a led.elf
-a 參數是檢視.elf檔案的所有内容
注意:編譯的程式運作不了有兩個原因:一個是要看運作平台對不對,第二個是要看處理器的大小端跟編譯的程式的大小端是否對應,可以使用arm-linux-readelf -a xxx.elf 指令檢視編譯出來的程式大小端情況和程式運作平台。
如下圖所示,編譯後的程式隻能運作在小端(little endian)的處理器上,其運作平台Machine是ARM。絕大多數ARM處理器都是小端的。

檢視程式運作平台還可以使用file xxx (xxx為編譯後可執行檔案) 指令檢視。
如一個應用程式不能執行,排除了運作平台和大小端的情況後,還有可能是庫不對。
使用arm-linux-readelf -d xxx (xxx為編譯後可執行檔案)檢視運作庫;如hello程式運作庫為libc.so.6,如果開發闆上沒有這個庫,程式是運作不了的。
1.4 交叉反彙編器 arm-linux-objdump
把hello.c檔案編譯成hello可執行檔案:arm-linux-gcc hello.c -o hello
用法:arm-linux -objdump -D -S hello >dump
把hello可執行檔案反彙編後輸入儲存到dump檔案中。
-D -S 是反彙編參數,>dump 把hello反彙編後的内容儲存到dump檔案中
注意: 在編譯hello時沒有使用-g參數,反彙編後的代碼和原來C代碼對應不起來。我們可以在編譯hello時使用-g參數:
先把hello.c檔案編譯成hello可執行檔案:arm-linux-gcc -g hello.c -o hello;運作arm-linux -objdump -D -S hello >dump指令,打開dump檔案可以看到
1.5檔案格式轉換器 arm-linux-objcopy
使用arm-linux-objcopy指令可以把ELF格式的檔案轉換成二進制檔案。
檔案格式轉換的原因:elf格式的檔案不能直接在ARM上運作(ARM隻能運作二進制格式的檔案);
用法:arm-linux-objcopy -O binary led.elf led.bin
把led.elf格式的檔案轉換成led.bin二進制檔案。
1.6庫管理器arm-linux-ar
arm-elf-ar将多個可重定位的目标子產品歸檔為一個函數庫檔案。采用函數庫檔案,應用程式能夠從該檔案中自動裝載要參考的函數子產品,同時将應用程式中頻繁調用的函數放入函數庫檔案中,易于應用程式的開發管理。arm-elf-ar支援ELF格式的函數庫檔案.