交叉编译工具链的使用
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平臺(tái)下的gcc的基本用法用法是完全一樣的;不同之處:標(biāo)準(zhǔn)的gcc所引用的頭文件路徑為 /usr/include/stdio.h,arm-linux-gcc所引用的頭文件路徑為其安裝路徑下,如 /usr/local/armtools/4.5.1/bin/..
1.2 交叉鏈接器?arm-linux-ld
??? arm-linux-ld命令是ARM平臺(tái)下的交叉鏈接器,把程序鏈接成可以在ARM平臺(tái)下運(yùn)行。
??? 用法:?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 參數(shù)是查看.elf文件的所有內(nèi)容
注意:編譯的程序運(yùn)行不了有兩個(gè)原因:一個(gè)是要看運(yùn)行平臺(tái)對(duì)不對(duì),第二個(gè)是要看處理器的大小端跟編譯的程序的大小端是否對(duì)應(yīng),可以使用arm-linux-readelf -a xxx.elf?命令查看編譯出來的程序大小端情況和程序運(yùn)行平臺(tái)。
??? 如下圖所示,編譯后的程序只能運(yùn)行在小端(little endian)的處理器上,其運(yùn)行平臺(tái)Machine是ARM。絕大多數(shù)ARM處理器都是小端的。
???
??? 查看程序運(yùn)行平臺(tái)還可以使用file?xxx?(xxx為編譯后可執(zhí)行文件) 命令查看。
??? 如一個(gè)應(yīng)用程序不能執(zhí)行,排除了運(yùn)行平臺(tái)和大小端的情況后,還有可能是庫(kù)不對(duì)。
使用arm-linux-readelf -d xxx?(xxx為編譯后可執(zhí)行文件)查看運(yùn)行庫(kù);如hello程序運(yùn)行庫(kù)為libc.so.6,如果開發(fā)板上沒有這個(gè)庫(kù),程序是運(yùn)行不了的。
????
1.4 交叉反匯編器?arm-linux-objdump
把hello.c文件編譯成hello可執(zhí)行文件:arm-linux-gcc hello.c -o hello
用法:arm-linux -objdump -D -S hello >dump
???????? 把hello可執(zhí)行文件反匯編后輸入保存到dump文件中。
?????????-D -S?是反匯編參數(shù),>dump 把hello反匯編后的內(nèi)容保存到dump文件中
??????
注意:?在編譯hello時(shí)沒有使用-g參數(shù),反匯編后的代碼和原來C代碼對(duì)應(yīng)不起來。我們可以在編譯hello時(shí)使用-g參數(shù):
??? 先把hello.c文件編譯成hello可執(zhí)行文件:arm-linux-gcc -g hello.c -o hello;運(yùn)行arm-linux -objdump -D -S hello >dump命令,打開dump文件可以看到
???????
1.5文件格式轉(zhuǎn)換器?arm-linux-objcopy
??? 使用arm-linux-objcopy命令可以把ELF格式的文件轉(zhuǎn)換成二進(jìn)制文件。
??? 文件格式轉(zhuǎn)換的原因:elf格式的文件不能直接在ARM上運(yùn)行(ARM只能運(yùn)行二進(jìn)制格式的文件);
??? 用法:arm-linux-objcopy -O binary led.elf led.bin
??????????? 把led.elf格式的文件轉(zhuǎn)換成led.bin二進(jìn)制文件。
1.6庫(kù)管理器arm-linux-ar
??? arm-elf-ar將多個(gè)可重定位的目標(biāo)模塊歸檔為一個(gè)函數(shù)庫(kù)文件。采用函數(shù)庫(kù)文件,應(yīng)用程序能夠從該文件中自動(dòng)裝載要參考的函數(shù)模塊,同時(shí)將應(yīng)用程序中頻繁調(diào)用的函數(shù)放入函數(shù)庫(kù)文件中,易于應(yīng)用程序的開發(fā)管理。arm-elf-ar支持ELF格式的函數(shù)庫(kù)文件.
總結(jié)
以上是生活随笔為你收集整理的交叉编译工具链的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32之SPI从机例程
- 下一篇: 成为大数据顶尖程序员,先过了这些Hado