1、基础知识¶
1.1 一行汇编¶
先用一行汇编,看下arm系列的编译,elf情况
mov r0, #1
使用交叉编译工具,先导出:
export PATH="/root/workspace/.toolchains/gcc-arm-none-eabi-10-2020-q4-major/bin/:$PATH"
arm-none-eabi-gcc test.S -nostdlib -o test.elf
Note
gcc编译默认会包含C库,我们不需要,所以加上 -nostdlib ,源文件是test.S , 目标文件是生成 test.elf
arm-none-eabi-objdump -xD test.elf > test.asm
DUMP出 ELF 内容,可以看到(部分内容):
test.elf: file format elf32-littlearm
test.elf
architecture: armv4t, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00008000
Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**16
filesz 0x00008004 memsz 0x00008004 flags r-x
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000004 00008000 00008000 00008000 2**2
1 .ARM.attributes 0000001a 00000000 00000000 00008004 2**0
2 .noinit 00000000 00018004 00018004 0000801e 2**0
Disassembly of section .text:
00008000 <__bss_end__-0x10004>:
8000: e3a00001 mov r0, #1
elf格式,小端,arch是armv4t(我们编译时没有指定cpu,default值),.text 段放在了 0x8000 位置,只有一行代码,机器码是 e3a00001
arm-none-eabi-objcopy -O binary test.elf test.bin
从 ELF 中导出可执行 binary 文件。我们一般 QEMU 会使用 ELF文件(qemu会解析),而实际的板子会使用bin文件,比如把bin文件烧到flash
xxd test.bin
root@iZj6ccyu2ndokc2ujnox0tZ:~/workspace/code/test# xxd test.bin
00000000: 0100 a0e3 ....
Bin 文件中就一条机器指令,也就是 “mov r0, #1” 这条汇编语句,翻译从 arm core 可以执行的机器指令。
Note
编译链接涉及的内容很庞大,不在我们讨论范围内,只做简单说明,满足我们使用即可。