编译与烧录
调试模式编译
# Package app/blinky
cargo build -p blinky
生产环境编译
# Package app/blinky
cargo build -r -p blinky
生产环境 HEX 格式编译
cargo objcopy --release -p blinky -- -O binary blinky.hex
开发板调试
embed 工具调试
使用 embed 进行调试时,需要调整一下配置。
- 调整配置
cd .cargo
cp config_embed.toml config.toml
- 烧录
cargo embed --target thumbv7m-none-eabi -p flash_tool_embed
probe-run 工具调试
使用 probe-run 进行调试时,需要调整一下配置。
- 调整配置
cd .cargo
cp config_defmt.toml config.toml
- 烧录 bin 文件
# 完整指令
cargo run --target thumbv7m-none-eabi -p blinky probe-run -- --chip STM32F103C8
# 简写, 配置的有 `.cargo/config.toml` 文件
cargo run -p blinky
# 别名
cargo rp blinky
- 烧录 HEX 文件 (未验证)
# 编译
cargo objcopy --release --target thumbv7m-none-eabi --offline -p blinky -- -O binary blinky.hex
cargo objcopy -p blinky -- -O binary blinky.hex
# 烧录
sudo mono avrdudess.exe
检查 ELF
现在在 target/thumbv7m-none-eabi/debug/blinky 中有一个非主机环境的 ELF 二进制文件。我们能使用 cargo-binutils 检查它。
使用 cargo-readobj 我们能打印 ELF 头,确认这是一个 ARM 二进制。
cargo readobj -p blinky -- --file-headers
注意:
-p blinky 是一个用来查看二进制项 target/$TRIPLE/debug/blinky 的语法糖
-p blinky 需要时也会重新编译二进制项。
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8000131
Start of program headers: 52 (bytes into file)
Start of section headers: 2850820 (bytes into file)
Flags: 0x5000200
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 5
Size of section headers: 40 (bytes)
Number of section headers: 23
Section header string table index: 21
检查二进制项的 linker section 的大小
cargo size -p blinky --release -- -A
我们使用 --release 查看优化后的版本
blinky :
section size addr
.vector_table 304 0x8000000
.text 376 0x8000130
.rodata 44 0x80002a8
.data 0 0x20000000
.gnu.sgstubs 0 0x80002e0
.bss 4 0x20000000
.uninit 0 0x20000004
.debug_loc 557 0x0
.debug_abbrev 1855 0x0
.debug_info 45223 0x0
.debug_aranges 504 0x0
.debug_ranges 304 0x0
.debug_str 40309 0x0
.debug_pubnames 21424 0x0
.debug_pubtypes 19774 0x0
.ARM.attributes 50 0x0
.debug_frame 680 0x0
.debug_line 3738 0x0
.comment 19 0x0
Total 135165
ELF linker sections 的介绍
- .text 包含程序指令
- .rodata 包含像是字符串这样的常量
- .data 包含静态分配的初始值非零的变量
- .bss 也包含静态分配的初始值是零的变量
- .vector_table 是一个我们用来存储向量(中断)表的非标准的 section
- .ARM.attributes 和 .debug_* sections 包含元数据,当烧录二进制文件时,它们不会被加载到目标上。
重要
ELF 文件包含像是调试信息这样的元数据,因此它们在硬盘上的尺寸没有正确地反应处程序被烧录到设备上时将占据的空间的大小。要一直使用 cargo-size 检查一个二进制项的大小。
反编译二进制项
cargo objdump -p blinky --release -- --disassemble --no-show-raw-insn --print-imm-hex
链接器脚本编译
cargo rustc -- -C link-arg=-Tlink.x