常用的交叉编译工具使用实例:
现有文件:源文件led.S及连接器脚本文件led.lds
i、arm-linux-gcc -g -c led.S -o led.o
-g选项告诉编译器添加调试用的信息。
-c告诉编译器只编译生成.o文件为止
ii、arm-linux-ld -Tled.lds -o led.elf led.o
-Tled.lds:链接器脚本文件选项
iii、arm-linux-readelf -a led.elf
arm-linux-readelf -d led.elf
-a:显示出全部信息
-d:dynamically linked libs查看库
iv、arm-linux-objdump -D -S led >dump
将反汇编之后的文件保存在一个名为dump的文件中,建议在反汇编之前的编译时生成调试信息,即加入-g选项。
v、arm-linux-objcopy -O binary led.elf led.bin
将生成的。elf文件转换成.bin文件,因为只有二进制文件才能在我们的目标机上运行。
2、上述一整套流程,可以用以个makefile来写:
eg:
led.bin:led.elf
[TAB] arm-linux-objcopy -O binary led.elf led.bin
led.elf:led.o led.lds
[TAB]arm-linux-ld -Tled.lds -o led.elf led.o
led.o:led.S
[TAB]arm-linux-gcc -g -c led.S -o led.o
clean:
[TAB]rm led.bin led.elf led.o
一定要注意格式,命令前面不能用空格,用的是换行TAB键。
相关命令,交叉工具链
arm-linux-gcc -g -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
elf转化为二进制文件
Makefile文件
[xpz@bogon led]$ cat Makefile
all: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o led.o -c led.S
.PHONY: clean
clean:
rm *.o led.elf led.bin
烧写到板子
norflash启动,格式化nandflash
format NAND FLASH for Linux
./dnw ./led/led.bin 30008000
拨到nandflash,启动
链接器脚本
链接器脚本-段
一个可执行程序通常是由:代码段,数
据段,bss段构成的。同样,在用于
链接这个程序的链接器脚本中,就会
反应出这几个段的信息
链接器脚本文件的组成:
基本构成:段:代码段.text 数据段.data bss段 .bss
起始链接地址
对齐
变量
代码段首文件
2、实例文件:
SECTIONS{
. = 0x0; //设置程序起始链接地址,=左右两边要空格
. = ALIGN(4);//,设置代码段四字节对齐,=左右两边要空格
.text ://冒号前要空格
{
start.o(.text)//设置代码段首文件,CPU一上电就开始执行。
*(.text)
}
. = ALIGN(4);//设置数据段四字节对齐,等号左右要空格
.data ://冒号钱要空格
{
*(.data)
}
. = ALIGN(4);//设置bss段四字节对齐,等号左右要空格
bss_start = .;//自定义变量bss_start,用于记录bss段起始地址,等号左右要空格
.bss :
{
*(.bss)
}
bss_end = .;//自定义变量bss_end,用于记录bss段结束地址,等号左右要空格
}
}
arm-linux-objdump -D -S led.elf >dump.txt
SECTIONS {
. = 0x30008000;
. = ALIGN(4);
.text :
{
led.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : {*(.rodata)}
. = ALIGN(4);
.data : {*(.data)}
. = ALIGN(4);
bss_start = .;
.bss : {*(.bss) *(COMMON)}
bss_end = .;
}
反汇编
[root@bogon d1]# arm-linux-objdump -D -S start.elf
start.elf: file format elf32-littlearm
Disassembly of section .text:
30000000 <_start>:
.text
.global _start
_start:
mov r1,#8
30000000:
e3a01008
mov
r1, #8
1110 00 1 1101 0000 0000 1000000001000
mov r2,r1
30000004:
e1a02001
mov
r2, r1
mov r3,#10
30000008:
e3a0300a
mov
r3, #10
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0:
00001941
andeq
r1, r0, r1, asr #18
4:
61656100
cmnvs
r5, r0, lsl #2
8:
01006962
tsteq
r0, r2, ror #18
c:
0000000f
andeq
r0, r0, pc
10:
00543405
subseq
r3, r4, r5, lsl #8
14:
01080206
tsteq
r8, r6, lsl #4
18:
Address 0x00000018 is out of bounds.
Disassembly of section .debug_aranges:
00000000 <.debug_aranges>:
0:
0000001c
andeq
r0, r0, ip, lsl r0
4:
00000002
andeq
r0, r0, r2
8:
00040000
andeq
r0, r4, r0
c:
00000000
andeq
r0, r0, r0
10:
30000000
andcc
r0, r0, r0
14:
0000000c
andeq
r0, r0, ip
...
Disassembly of section .debug_info:
00000000 <.debug_info>:
0:
0000003c
andeq
r0, r0, ip, lsr r0
4:
00000002
andeq
r0, r0, r2
8:
01040000
tsteq
r4, r0
c:
00000000
andeq
r0, r0, r0
10:
30000000
andcc
r0, r0, r0
14:
3000000c
andcc
r0, r0, ip
18:
72617473
rsbvc
r7, r1, #1929379840
; 0x73000000
1c:
00532e74
subseq
r2, r3, r4, ror lr
20:
6f6f722f
svcvs
0x006f722f
24:
72612f74
rsbvc
r2, r1, #464
; 0x1d0
28:
65642f6d
strbvs
r2, [r4, #-3949]!
; 0xf6d
2c:
642f6f6d
strtvs
r6, [pc], #3949
; 34 <_start-0x2fffffcc>
30:
4e470031
mcrmi
0, 2, r0, cr7, cr1, {1}
34:
53412055
movtpl
r2, #4181
; 0x1055
38:
322e3220
eorcc
r3, lr, #2
3c:
80010030
andhi
r0, r1, r0, lsr r0
Disassembly of section .debug_abbrev:
00000000 <.debug_abbrev>:
0:
10001101
andne
r1, r0, r1, lsl #2
4:
12011106
andne
r1, r1, #-2147483647
; 0x80000001
8:
1b080301
blne
200c14 <_start-0x2fdff3ec>
c:
13082508
movwne
r2, #34056
; 0x8508
10:
00000005
andeq
r0, r0, r5
Disassembly of section .debug_line:
00000000 <.debug_line>:
0:
00000033
andeq
r0, r0, r3, lsr r0
4:
001e0002
andseq
r0, lr, r2
8:
01020000
tsteq
r2, r0
c:
000d0efb
strdeq
r0, [sp], -fp
10:
01010101
tsteq
r1, r1, lsl #2
14:
01000000
tsteq
r0, r0
18:
00010000
andeq
r0, r1, r0
1c:
72617473
rsbvc
r7, r1, #1929379840
; 0x73000000
20:
00532e74
subseq
r2, r3, r4, ror lr
24:
00000000
andeq
r0, r0, r0
28:
00020500
andeq
r0, r2, r0, lsl #10
2c:
15300000
ldrne
r0, [r0]!
30:
02022f2f
andeq
r2, r2, #188
; 0xbc
34:
Address 0x00000034 is out of bounds.
[root@bogon d1]#
mov r1,#0xff //只能8位,超过8位用ldr
ldr r1,=0x1ff
mov r1,#0xff
30000000:
e3a010ff
mov
r1, #255
; 0xff
ldr r1,=0x1ff
30000004:
e51f1004
ldr
r1, [pc, #-4]
; 30000008 <_start+0x8>
30000008:
000001ff
strdeq
r0, [r0], -pc
协处理器用于执行特定的处理任务,如:
数学协处理器可以控制数字处理,以减轻
处理器的负担。ARM可支持多达16个协处
理器,其中CP15是最重要的一个。
mrc p15,0,r0,c0,c0,0