首页 > 系统相关 >qemu+arm-linux-gdb模拟运行ARM程序

qemu+arm-linux-gdb模拟运行ARM程序

时间:2022-12-21 21:33:58浏览次数:55  
标签:elf ARM start gdb linux test arm

在进行ARM汇编语言学习的阶段,如果没有开发板和类似于JLink的JTAG硬件调试器时,那么通常会选择在PC机上模拟运行ARM程序。方法大致有两类,第一类方法就是安装像MDK或IAR的集成开发环境,在该集成开发环境中进行代码编写,编译,模拟运行并调试。该类方法的主要特点是简单、易用,但是这些集成开发环境通常都是用各自定义的汇编伪代码,需要进行熟悉;另一方面就是通常这类集成开发环境所支持的ARM核的版本不是很高,通常只能模拟运行ARM9及以下的ARM核,当然ARM公司的DS-5是一个不错的选择,但上述商业软件都是要付费的。第二类方法就是使用开源的模拟器加调试工具,大特点就是免费,并且能支持较高版本的ARM核,这也是本文要介绍的方法。整个环境的搭建分为以下几个步骤。

一、在Linux(如Ubuntu)中安装交叉编译工具链,这个步骤很简单,在这里不再赘述。需要注意的是交叉编译工具链中需要包含交叉的gdb调试工具,如果没有可以移植一个。

二、安装qemu模拟器,在Ubuntu-12.04的32位版本中可以使用下面的指令进行安装。

$ sudo apt-get install qemu qemu-system qemu-utils

三、编写测试代码。一个简单的测试代码包含下面四个文件。

start.S # ARM汇编源文件

1 .text

2 .global _start

3 _start:

4 ldr r0, stacktop

5 mov sp, r0

6

7 stop:

8 nop

9 b stop

10

11 stacktop: .word stack + 4 * 4096

12

13 .data

14 stack: .space 4 * 4096

Makefile

1 all:

2 arm-linux-gcc -g -c -o start.o start.S

3 arm-linux-ld -Tmap.lds -o test.elf start.o

4

5 run: all

6 qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S -s &

7 sleep 3

8 arm-linux-gdb test.elf

9 clean:

10 rm -rf *.o test.elf

在上面Makefile中启动qemu模拟器的参数解释如下:

$ qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S –s

-machine vexpress-a9:指定开发板,该开发板是QEMU中支持的一款ARM公司的基于Cortex-A9的开发板

-m 256M:指定物理内存的大小

-serial stdio:指定串口为标准输入输出

-kernel test.elf:指定要运行的elf格式的可执行文件

-S:虚拟机启动后立即暂停,等侍gdb连接

-s:在1234接受gdb调试连接

map.lds # 链接脚本

1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

2 OUTPUT_ARCH(arm)

3 ENTRY(_start)

4 SECTIONS

5 {

6 . = 0x0;

7 . = ALIGN(4);

8 .text :

9 {

10 start.o(.text)

11 *(.text)

12 }

13

14 . = ALIGN(4);

15 .rodata :

16 { *(.rodata) }

17

18 . = ALIGN(4);

19 .data :

20 { *(.data) }

21

22 . = ALIGN(4);

23 .bss :

24 { *(.bss) }

25 }

.gdbinit # gdb运行的初始化文件

1 target remote localhost:1234

四、编译并运行测试代码,执行下面的命令首先编译,然后运行,在gdb的命令行模式下即可进行程序的调试。

$ make

arm-linux-gcc -g -c -o start.o start.S

arm-linux-ld -Tmap.lds -o test.elf start.o

$ make run

arm-linux-gcc -g -c -o start.o start.S

arm-linux-ld -Tmap.lds -o test.elf start.o

qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S -s &

sleep 3

arm-linux-gdb test.elf

GNU gdb 6.8

Copyright (C) 2008 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-build_pc-linux-gnu --target=arm-cortex_a8-linux-gnueabi"...

[New Thread 1]

_start () at start.S:4

4 ldr r0, stacktop

Current language: auto; currently asm

(gdb)

五、常用的gdb调试命令。

l:列出源代码

b 5:在5行设置断点

i b:查看断点信息

i r:查看寄存器值

set $r1 = 5:设置寄存器的值

p i:打印变量i的值

p/x i:以十六进制打印变量i的值

set var i = 3:设置变量i的值

x/16xb 0x0:以16进制形式查看0地址开始的16个字节的内存内容

bt:查看栈回溯信息

q:退出gdb

六、如果不太习惯命令行模式,则只需要使用一个gdb的图形前端,比如ddd。可以使用下面的命令来安装ddd。

$ sudo apt-get install ddd

七、安装完成后,修改Makefile,将:

arm-none-linux-gnueabi-gdb test.elf

改为:

ddd --debugger arm-none-linux-gnueabi-gdb test.elf

即可。运行后效果如下:

QEMU还可以模拟运行U-Boot及Linux操作系统,使用类似的方法也可以进行调试。这大大降低了ARM学习的成本。另外,gdb的前端还有insight、eclipse等,这些都能提供更友好的图形界面,从而使调试变得更加的简便。

来源: http://emb.华清远见.com/Column/3657.html

标签:elf,ARM,start,gdb,linux,test,arm
From: https://www.cnblogs.com/dyg540/p/16997279.html

相关文章

  • Linux centos7下启动和关闭nginx命令
    linux下面启动nginx和关闭nginx,查看linux开放的所有端口netstat-ntpl,重启服务命令:servicenetworkrestart 1进入到安装的目录里面whereisnginx 2.进入该......
  • Linux之资源管理器
    top命令用于实时的监控系统的处理器状态,以及其他硬件负载信息还有其他动态的进程信息等还可以按照排名,先后的显示某个进程CPU,内存的使用情况排名。top实际用法如下:1.进......
  • Linux中进程管理命令
    1.PS命令,用于报告当前系统的进程状态的命令ps-ef显示所有详细的进程信息-e列出程序时,显示每个程序所使用的环境变量-f显示UIDPID......
  • Java执行操作系统命令-Process抽象类(2)(Linux)
    Java820.04.1-UbuntuEclipseVersion:2022-09(4.25.0)-- 前一篇是在Windows上执行命令,本篇介绍在Linux系统中执行命令。测试命令:ls、cd、pwd 测试代码Proce......
  • 基于Linux Kernel 4.8的Ubuntu 16.10 即将发布
    今天早些时候,我们惊讶的发现Ubuntu16.10(YakketyYak)已经基于Linux Kernel4.8分支了,Linux4.8分支目前还在研发状态,最终版本将于今年10月2日正式上线。此前Ubuntu16.10......
  • HarmonyOS如何实现封装
    简化代码的一些措施http.js/***sendhttprequestutilfile*/importhttpfrom'@ohos.net.http';constBase_Url='http://nja5ih.natappfree.cc'expo......
  • Zabbix通过proxy的被动模式代理来跨网段监控Linux主机
      上篇文章使用zabbixproxy实现主动代理跨网段分布式监控(https://blog.51cto.com/u_15105742/5956857),我们已经配置完架构图中的主动模式的监控部分,在这篇文章中我们就......
  • 带你玩转OpenHarmony AI:基于Seetaface2的人脸识别
     简介随着时代的进步,全民刷脸已经成为一种新型的生活方式,这也是全球科技进步的又一阶梯,人脸识别技术已经成为一种大趋势,无论在智慧出行、智能家居、智慧办公等场景均......
  • 20个Linux命令
    1查看目录以及权限在windows中,使用dir查看当前目录中文件。在Linux中使用ls(list)查看当前目录文件。windows中的dir,如下图所示在Linux中,通常使用ls-l列出,其中可......
  • Linux /etc/passwd 说明【转】
    Linux系统中的/etc/passwd文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。首先我们来打开这个文件,看看到底包含......