交叉編譯工具鏈
1、嵌入式開發模型-交叉開發
在嵌入式開發過程中有宿主機和目標機的角色之分:宿主機是執行編譯、鏈接嵌入式軟件的計算機;目標機是運行嵌入式軟件的硬件平台。
在宿主機執行編譯的流程如下:
2、交叉編譯工具鏈詳解
參考:
http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html
3、制作交叉編譯工具
參考:
http://www.crifan.com/files/doc/docbook/crosstool_ng/release/html/crosstool_ng.html
4、交叉編譯工具
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
常用的交叉編譯工具:
4.1 交叉編譯器 arm-linux-gcc
和X86平台下的gcc的基本用法用法是完全一樣的;不同之處:標准的gcc所引用的頭文件路徑為 /usr/include/stdio.h,arm-linux-gcc所引用的頭文件路徑為其安裝路徑下,如 /usr/local/armtools/4.5.1/bin/..
4.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是鏈接器腳本,
4.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,如果開發板上沒有這個庫,程序是運行不了的。
4.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文件可以看到
4.5文件格式轉換器 arm-linux-objcopy
使用arm-linux-objcopy命令可以把ELF格式的文件轉換成二進制文件。
文件格式轉換的原因:elf格式的文件不能直接在ARM上運行(ARM只能運行二進制格式的文件);
用法:arm-linux-objcopy -O binary led.elf led.bin
把led.elf格式的文件轉換成led.bin二進制文件。
4.6庫管理器arm-linux-ar
arm-elf-ar將多個可重定位的目標模塊歸檔為一個函數庫文件。采用函數庫文件,應用程序能夠從該文件中自動裝載要參考的函數模塊,同時將應用程序中頻繁調用的函數放入函數庫文件中,易於應用程序的開發管理。arm-elf-ar支持ELF格式的函數庫文件.
轉自:https://www.cnblogs.com/AP0904225/p/5904950.html