一、交叉編譯工具鍊字首:arm-none-linux-gnueabi-
二、常用指令
(注:此處以彙編點亮led燈代碼為例)
重點掌握:
1. gcc 編譯指令
arm-none-linux-gnueabi-gcc -c ***.S或***c -o ***.o
eg:
arm-none-linux-gnueabi-gcc -c led_asm.S -o led_asm.o
2. ld 連結:将所有的.o檔案連結生成可執行檔案 不是純粹的二進制檔案
arm-none-linux-gnueabi-ld -Ttext=0x43c00000 ***.o ***.o -o ***.elf
eg:
arm-none-linux-gnueabi-ld -Ttext=0x43c00000 led_asm.o -o led_asm.elf
-Ttext=0x43c00000:指定程式的入口位址 連結的時候才可以指定程式的入口位址
-Tmap.lds :指定連結腳本
3. objdump 将.elf檔案反彙編生成反彙編檔案(.dis)
arm-none-linux-gnueabi-objdump -D ***.elf > ***.dis
eg:
arm-none-linux-gnueabi-objdump -D led_asm.elf > led_asm.dis
4. objcopy 将.elf檔案生成二進制檔案(.bin)
arm-none-linux-gnueabi-objcopy -O binary ***.elf ***.bin
eg:
arm-none-linux-gnueabi-objcopy -O binary led_asm.elf led_asm.bin
-O binary:輸出二進制檔案
5. nm : 檢視可執行檔案的符号表
arm-none-linux-gnueabi-nm ***.elf
eg:
arm-none-linux-gnueabi-nm led_asm.elf
6. size : 檢視可執行檔案中各個資料段的大小
arm-none-linux-gnueabi-size ***.elf
eg:
arm-none-linux-gnueabi-size led_asm.elf
7. readelf : 檢視可執行檔案的頭部資訊
arm-none-linux-gnueabi-readelf -h ***.elf
eg:
arm-none-linux-gnueabi-readelf -h led_asm.elf
重點掌握:
8. strip : 壓縮檔案指令
删除可執行檔案中的符号表,符号表不影響程式的運作
注意:不可以對中間檔案執行strip指令 比如:.o檔案
嵌入式硬體資源存儲空間有限,可以使用strip對鏡像進行壓縮。
arm-none-linux-gnueabi-strip 要壓縮的檔案名
eg:
arm-none-linux-gnueabi-strip led_asm.elf
重點掌握:
9. addr2line 根據位址資訊定位錯誤資訊
arm-none-linux-gnueabi-addr2line -e ***.elf 錯誤位址 -a -f
-e:指定可執行檔案的
-a -f: 回顯錯誤位址對應的函數的名字
eg:
arm-none-linux-gnueabi-addr2line -e interface.elf 0x43c01768 -a -f
[email protected]:02-led-c$ arm-none-linux-gnueabi-addr2line -e interface.elf 0x43c01768 -a -f
0x43c01768
hal_led_init
/home/hqyj/20021/ARM/02-led-c/main.c:37
常用于定位野指針或者空指針等錯誤資訊引起的核心崩潰。
當核心崩潰時,再列印核心的崩潰的位址資訊。
10. 總結
gnu指令名 --help : 檢視幫助手冊
百度gnu指令的使用