【问题标题】:Breakpoints on ARMARM 上的断点
【发布时间】:2015-06-23 13:07:57
【问题描述】:

我最近读到,ARM 上的 Linux 软件断点是在 ARM 模式下使用 UND 指令和在 Thumb 模式下使用 BKPT 指令实现的。为什么有 2 条单独的指令用于引发软件中断?

【问题讨论】:

  • arm 和 thumb 是两个不同的指令集。
  • @dwelch 我知道它们是两个不同的指令集。但是,为什么需要有 2 个单独的断点指令? ARM 没有定义断点指令是什么,Linux 会定义(与 x86/x64 的断点指令相反)。
  • ARM没有bkpt指令starting armv5吗?编辑:没关系,如果是 Linux,它可能需要支持所有 ARM 版本。
  • 还需要两个单独的断点指令,可能是因为它们是两个不同的指令集(即每个指令集一个断点指令)。我相信其他指令碰巧在指令集之间具有相同名称的事实可能只是为了方便。
  • 如果您要询问人类的助记符,这完全是汇编程序(读取 ascii 并生成机器代码的程序)的一时兴起,它从一个汇编程序到另一个汇编程序有所不同,就像push 是一个只有拇指的指令,而 arm 没有,但随后汇编程序开始容忍 arm 指令的助记符 push。无论如何,如果它是关于 ascii/助记符命令的,那么这只是汇编器作者的意见问题,除非那个人或那些人在这里分享他们的心血来潮,不确定你会得到答案。

标签: linux linux-kernel gdb arm breakpoints


【解决方案1】:

拇指兼容代码:

0000e150 <pthread_mutexattr_setpshared>:
    e150:   b573        push    {r0, r1, r4, r5, r6, lr}
    e152:   4605        mov r5, r0
    e154:   460c        mov r4, r1
    e156:   4616        mov r6, r2
    e158:   f7fd fa70   bl  b63c <pthread_mutexattr-0xba>
    e15c:   4629        mov r1, r5

纯手臂:

0000d564 <pthread_mutex_init>:
    d564:   e2503000    subs    r3, r0, #0
    d568:   03a00016    moveq   r0, #22
    d56c:   012fff1e    bxeq    lr

arm bkpt 0xe7f001f0

拇指 bkpt 0xde01

如果尝试使用 always arm bkpt 并重写函数中的第一条指令: pthread_mutex_init 一切正常,但如果重写 pthread_mutexattr_setpshared 中的第一条指令,第二条指令也将被重写。

如果总是尝试使用 thumb bkpt 并重写 pthread_mutex_init 中的第一条指令,结果指令将无效。

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2015-12-28
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多