加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

创建交叉编译环境 QEMU、GDB的安装及简单使用

(2013-05-07 15:34:38)
分类: Linux实验

2.4  实例—创建交叉编译环境

1.从网上下载或使用开发板公司在附赠光盘中提供的交叉编译工具链

(1)从网上下载arm-linux-gcc或arm-linux-tools压缩包

(2)解压arm-linux-gcc-2.95.3.tar.bz2到/usr/local/arm/中

# mkdir /usr/local/arm

# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm/

# ls -F /usr/local/arm/2.95.3/

arm-linux/  bin/  include/  info/  lib/  man/  share/  test-if-write

arm-linux-gcc-2.95.3版本的交叉编译器用于编译Linux2.4内核、BusyBox、BootLoader(u-boot)等。

(3)解压arm-linux-gcc-3.4.1.tar.bz2到/usr/local/arm/中

# tar -xjvf arm-linux-gcc-3.4.1.tar.bz2 -C

# ls -F /usr/local/arm/3.4.1/

arm-linux/  bin/  include/  info/  lib/  libexec/  man/  tmp/

arm-linux-gcc-3.4.1及其以后版本的交叉编译器用于编译Linux2.6内核、BusyBox、BootLoader(u-boot)等。在编译时如果所用的版本不行的话,可以试试其它的版本,可以在Makefile文件中指定。

(4)解压arm-linux-tools-20070808.tar.gz(4.2.1版本)

# tar -xzvf arm-linux-tools-20070808.tar.gz  -C /

# arm-linux-

arm-linux-addr2line      arm-linux-flthdr         arm-linux-gfortran       arm-linux-objdump

arm-linux-addr2name.awk  arm-linux-g++            arm-linux-gjnih          arm-linux-ranlib

arm-linux-ar             arm-linux-gcc            arm-linux-jcf-dump       arm-linux-readelf

arm-linux-as             arm-linux-gcc-4.2.1      arm-linux-jv-scan        arm-linux-size

arm-linux-c++            arm-linux-gccbug         arm-linux-ld             arm-linux-strings

arm-linux-c++filt        arm-linux-gcj            arm-linux-ld.real        arm-linux-strip

arm-linux-cpp            arm-linux-gcjh           arm-linux-nm

arm-linux-elf2flt        arm-linux-gcov           arm-linux-objcopy

# which arm-linux-gcc

/usr/local/bin/arm-linux-gcc

# ll /usr/local/bin/arm-linux-*

 

-rwxr-xr-x. 2 root root   176612 8月   8 2007 arm-linux-gcc

-rwxr-xr-x. 2 root root   176612 8月   8 2007 arm-linux-gcc-4.2.1

至此,arm-linux-*交叉编译工具链安装成功。

注意:经过上述安装步骤,本系统默认的arm-linux-gcc是arm-linux-gcc-4.2.1,如果要使用其它版本,可以在Makefile文件中指定。

2.5  实例—QEMU、GDB的安装及简单使用

2.5.1  QEMU的安装

1.在http://www.qemu.org/下载QEMU最新版

# wget http://wiki.qemu-project.org/download/qemu-1.4.0.tar.bz2

2.解压qemu-1.4.0.tar.bz2

# tar -xjvf qemu-1.4.0.tar.bz2

3.生成QEMU的Makefile

# cd qemu-1.4.0

# ./configure --target-list=arm-softmmu,arm-linux-user

4.编译、安装QEMU

# make -j 2                   //双核的CPU

# make install         //命令安装在/usr/local/bin/

5.查看QEMU版本

# qemu-arm -version

qemu-arm version 1.4.0, Copyright (c) 2003-2008 Fabrice Bellard

# qemu-system-arm --version

QEMU emulator version 1.4.0, Copyright (c) 2003-2008 Fabrice Bellard

6.查看QEMU命令

# qemu

qemu-arm qemu-ga qemu-img qemu-io qemu-nbd qemu-system-arm

2.5.2  GDB的安装

1.在http://www.gnu.org/software/gdb/下载GDB最新版

# wget ftp://sourceware.org/pub/gdb/releases/gdb-7.5.1.tar.bz2

2.解压gdb-7.5.1.tar.bz2

# tar -xjvf gdb-7.5.1.tar.bz2

3.生成GDB的Makefile

# cd gdb-7.5.1

# ./configure --target=arm-linux

4.编译、安装GDB

# make

# make install

两个命令安装在/usr/local/bin/:arm-linux-run、arm-linux-gdb。

5.查看GDB版本

# arm-linux-gdb -v

GNU gdb (GDB) 7.5.1

2.5.3  运行ARM汇编程序

1.编辑汇编源文件test.S

# cat test.S

.section .data

 

msg:

         .ascii  "Hello, ARM!\n"

len = . - msg

 

.section .text

 

.globl _start

_start:

        

         mov   r0, $1          

         ldr      r1, =msg               

         ldr      r2, =len                

         mov   r7, $4          

         swi     $0                        

        

        

         mov   r0, $0          

         mov   r7, $1          

         swi     $0                        

2.汇编、链接、执行

# arm-linux-as test.S -o test.o

# arm-linux-ld test.o -o test

# qemu-arm test

Hello, ARM!

2.5.4  调试ARM汇编程序

注意,需要打开两个终端窗口,它们的当前路径一样。

1.第一个终端窗口:汇编、链接、执行

# arm-linux-as test.S -g -o test.o

# arm-linux-ld test.o -o test

# qemu-arm -g 9999 test

2.第二个终端窗口:执行arm-linux-gdb

# service iptables stop

# arm-linux-gdb test

GNU gdb (GDB) 7.5.1

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux".

For bug reporting instructions, please see:

...

Reading symbols from /root/桌面/嵌入式教程/test...done.

(gdb) target remote localhost:9999

Remote debugging using localhost:9999

[New Remote target]

[Switching to Remote target]

_start () at test.S:12

12               mov             r0, $1                   

(gdb) disassemble

Dump of assembler code for function _start:

=> 0x00008074 <+0>:      mov   r0, #1

   0x00008078 <+4>:      ldr      r1, [pc, #20]  ; 0x8094 <_start+32>

   0x0000807c <+8>:      mov   r2, #12

   0x00008080 <+12>:    mov   r7, #4

   0x00008084 <+16>:    svc     0x00000000

   0x00008088 <+20>:    mov   r0, #0

   0x0000808c <+24>:     mov   r7, #1

   0x00008090 <+28>:    svc     0x00000000

   0x00008094 <+32>:    muleq r1, r8, r0

End of assembler dump.

(gdb) info register

r0             0x0        0

r1             0x40a00568      1084228968

r2             0x0        0

r3             0x0        0

r4             0x0        0

r5             0x0        0

r6             0x0        0

r7             0x0        0

r8             0x0        0

r9             0x0        0

r10            0x10098 65688

r11            0x0        0

r12            0x0        0

sp             0x40a00408      0x40a00408

lr             0x0         0

pc             0x8074   0x8074 <_start>

cpsr           0x10       16

(gdb) si

13               ldr               r1, =msg               

(gdb) si

14               ldr               r2, =len                

(gdb) si

15               mov             r7, $4          

(gdb) info register

r0             0x1        1

r1             0x10098 65688

r2             0xc        12

r3             0x0        0

r4             0x0        0

r5             0x0        0

r6             0x0        0

r7             0x0        0

r8             0x0        0

r9             0x0        0

r10            0x10098 65688

r11            0x0        0

r12            0x0        0

sp             0x40a00408      0x40a00408

lr             0x0         0

pc             0x8080   0x8080 <_start+12>

cpsr           0x10       16

(gdb) si

16               swi              $0                                 

(gdb) disassemble

Dump of assembler code for function _start:

   0x00008074 <+0>:      mov   r0, #1

   0x00008078 <+4>:      ldr      r1, [pc, #20]  ; 0x8094 <_start+32>

   0x0000807c <+8>:      mov   r2, #12

   0x00008080 <+12>:    mov   r7, #4

=> 0x00008084 <+16>:    svc     0x00000000

   0x00008088 <+20>:    mov   r0, #0

   0x0000808c <+24>:     mov   r7, #1

   0x00008090 <+28>:    svc     0x00000000

   0x00008094 <+32>:    muleq r1, r8, r0

End of assembler dump.

(gdb) si                 

19               mov             r0, $0                   

(gdb) si

20               mov             r7, $1                   

(gdb) si

21               swi              $0                                 

(gdb) disassemble

Dump of assembler code for function _start:

   0x00008074 <+0>:      mov   r0, #1

   0x00008078 <+4>:      ldr      r1, [pc, #20]  ; 0x8094 <_start+32>

   0x0000807c <+8>:      mov   r2, #12

   0x00008080 <+12>:    mov   r7, #4

   0x00008084 <+16>:    svc     0x00000000

   0x00008088 <+20>:    mov   r0, #0

   0x0000808c <+24>:     mov   r7, #1

=> 0x00008090 <+28>:    svc     0x00000000

   0x00008094 <+32>:    muleq r1, r8, r0

End of assembler dump.

(gdb) info register

r0             0x0        0

r1             0x10098 65688

r2             0xc        12

r3             0x0        0

r4             0x0        0

r5             0x0        0

r6             0x0        0

r7             0x1        1

r8             0x0        0

r9             0x0        0

r10            0x10098 65688

r11            0x0        0

r12            0x0        0

sp             0x40a00408      0x40a00408

lr             0x0         0

pc             0x8090   0x8090 <_start+28>

cpsr           0x10       16

(gdb) si                 

[Inferior 1 (Remote target) exited normally]

(gdb)

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有