交叉工具鏈。鏈即為集合,交叉工具鏈也就是交叉工具的集合。平時在電腦上寫程序然后再進行編譯鏈接等操作最后生成一個可執行程序,該文件都只能在X86架 構硬件上運行,而不能在我現在使用的開發板,也就是ARM架構上運行。所以進行ARM的裸機程序開發要有一套自己的工具。交叉工具鏈的安裝和環境變量的配置昨天學過了,現在已經忘得差不多了,但是以后會補上的。廢話少說,下面開始記錄今天學到的東西。
1、交叉編譯器
顧名思義,就是將寫好的C程序代碼編譯為ARM架構下的可執行文件。以前在電腦上使用的gcc,編譯后的可執行文件只能在X86架構下運行,簡單的說就是 只能在電腦上運行。用法很簡單:“gcc [options] 源代碼名 -o 可執行文件名”。而交叉編譯器的用法幾乎和它一模一樣:“arm-linux-gcc [options] 源代碼名 -o 可執行文件名”。這樣生成的可執行程序就可以在我的開發板上運行了。
2、交叉鏈接器
將多個編譯后產生的過程文件連接為一個最終的可執行文件。比如寫了兩個C程序代碼,一個.c文件,有main函數,另一個.h文件,沒有main函數,現 在要將這兩個編譯后產生的obj文件鏈接為最終的可執行文件,就要用到交叉編譯器。用法:“arm-lnux-ld [options] 鏈接器腳本 -o 文件名.elf 鏈接所需要的文件.o”。這樣就能將多個文件鏈接成可以在操作系統中運行的可執行文件了。
3、交叉ELF文件查看器
用來查看一個可執行文件的相關信息。用法:“arm-linux-readelf [options] elf文件名”。比較常用的“arm-linux-readelf -a elf” ,可以查看elf文件的運行架構,大小端等信息
像這個圖中,是一個可以在小端上運行的elf。
還有“arm-linux-readelf -d elf文件名”,用於顯示程序需要的動態鏈接庫。
如圖所示,該程序需要libc.so.6這個庫。
4、交叉反匯編器
將一個可執行文件轉換為匯編下的程序。用法:“arm-linux-objdump -D -S elf文件名 >目標文件”,將該文件轉為匯編語言並放到目標文件夾中。
如圖將轉為匯編語言后的代碼放入dump這個文件中,然后用vi dump這個命令即可查看
用/main查找到main函數的位置
如圖所示,該圖可以看到C語言代碼語句與匯編語言語句的對應,這個功能只要在編譯該程序時添加“-g”選項(編譯過程中帶上調試信息)即可實現。
5、交叉轉換器
將elf格式文件需要的格式。我的理解就是類似於當初學51時將編譯后的文件生成為一個hex文件,而在ARM中是生成為bin文件。用法:“arm-linux-objcopy -O 目標文件格式 原ELF文件 目標文件”。
如圖,hello-arm為一個ELF文件,通過交叉轉換器使其轉為可執行的二進制bin文件。
上述所有操作都必須在root用戶下進行!因為安裝交叉工具鏈時安裝在了根目錄下的usr里,別的用戶無法使用。
今天早上就學了這么多,記下來方便自己以后忘了來查看。加油!
============================分割線============================
第二次看這部分的內容,發現以前的理解還是有些問題的。ELF文件即為linux操作系統中的可執行文件,相當於windows下的exe。他不能運行在裸機中,因為運行它必須要有ELF解析器,顯然裸機開發過程是沒有這個東西的。裸機只認二進制文件,像我們使用的uboot.bin,所以在我們用gcc編譯出ELF文件后,還需要用轉換器objcopy將其轉換為二進制文件。然而有了linux操作系統的支持,我們就可以直接執行gcc直接編譯或者由ld鏈接生成的可執行文件了。