一、需要用到的工具:
编译工具:arm-linux-gcc
链接工具:arm-linux-ld
格式转换工具:arm-linux-objcopy
反汇编器:arm-linux-objdump
文件信息查看:arm-linux-readelf
下载工具:dnw
调试工具:arm-linux-gdb
JLink驱动:JLinkGDBServer
二、工具说明(以hello.c为例)
1)arm-linux-gcc工具时只编译不链接,使其生成目标文件即可(.o文件)。
其用法:arm-linux-gcc hello.c -o hello
2)arm-linux-lds来完成链接.
其用法为:arm-linux-ld -T*.lds(链接脚本文件) -o *.elf *.o *.o(所需要链接的文件)
3) arm-linux-objcopy使ELF文件变为bin文件。
链接后的文件为.elf格式的,这并不能在ARM上直接运行,能在ARM上运行的是二进制文件,格式为.bin。此时,还需另一工具arm-linux-objcopy来完成转换,使ELF文件变为bin文件。
其用法如下:arm-linux-objcopy -O binary *.elf *.bin //-O binary意味输出二进制文件
至此,能在ARM上运行的可执行的文件就制作好了
注:编译时加上调试信息(-g) 才会在反汇编时会有C的语句出现,如printf("hello world");的出现,C与汇编对应起来更容易查找错误所在
5)arm-linux-readelf工具可以用来查看elf格式文件的信息,如下
[ymf@localhost example]$ arm-linux-readelf -a led.elf
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
由此信息可看到,此ELF文件使用平台为ARM,采用小端格式存储数据.
arm-linux-readelf还可以用来查看所需的库文件,如下所示
[ymf@localhost example]$ arm-linux-readelf -d hello
Dynamic section at offset 0x450 contains 24 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8278
0x0000000d (FINI) 0x841c
三、调试工具
1)安装GDB Server,还需在环境变量中增加其路径,使用如下命令.
然后在其文件倒数第二行增加如下内容:
export PATH=$PATH:/opt/arm-linux-gdb/bin
注:因为在arm-linux-gcc中同样含有arm-linux-gdb工具,但此版本(6.8.50)并不能在arm中使用,需要在网上下载更高版 本的,而把arm-linux-gdb放在倒数第二行,是因为,我们需要优先使用专门下载的arm-linux-gdb工具,.bashrc最后两行 代码如下:
export PATH=$PATH:/opt/arm-linux-gdb/bin
export PATH=$PATH:/usr/local/share/arm_bin/4.3.2/bin
在调用arm-linux-gdb时,同样会因为操作系统为64位,软件为32位,出现错误,如下
arm-linux-gdb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
使用如下命令安装所需32位库即可
yum install xulrunner.i686
2)