3

我正在使用ARM Embedded Tollchain在使用 newLib 的 stm32 微控制器上运行一个项目。

我打电话assert(false)来测试断言输出并以硬故障异常结束。我调试到程序集assert(...)并发现随后调用_exit(1)跳转到一个地址至极被调用_etext。查看_etext的手册页显示这_etext是 .text 部分末尾的地址。

我真的很困惑。通常我认为这_exit()__exit()我在一个名为syscalls.c.

为什么_exit()跳到_etext?

以下是一些应对片段,以便更好地理解:

从 newLib 2.5中对_exit()by的后续调用:assert()

_VOID
_DEFUN_VOID (abort)
{
#ifdef ABORT_MESSAGE
  write (2, "Abort called\n", sizeof ("Abort called\n")-1);
#endif

  while (1)
    {
      raise (SIGABRT);
      _exit (1);
    }
}

abort和的拆卸assert。特别看一下执行跳转到 80a5198 ( _etext) 的地址 0808a10a:

        abort:
0808a100:   push    {r3, lr}
0808a102:   movs    r0, #6
0808a104:   bl      0x808bfdc <raise>
0808a108:   movs    r0, #1
0808a10a:   bl      0x80a51d8
0808a10e:   nop     
          __assert_func:
0808a110:   push    {lr}
0808a112:   ldr     r4, [pc, #40]   ; (0x808a13c <__assert_func+44>)
0808a114:   ldr     r6, [r4, #0]
0808a116:   mov     r5, r0
0808a118:   sub     sp, #20
0808a11a:   mov     r4, r3
0808a11c:   ldr     r0, [r6, #12]
0808a11e:   cbz     r2, 0x808a136 <__assert_func+38>
0808a120:   ldr     r3, [pc, #28]   ; (0x808a140 <__assert_func+48>)
0808a122:   str     r2, [sp, #8]
0808a124:   stmia.w sp, {r1, r3}
0808a128:   mov     r2, r4
0808a12a:   mov     r3, r5
0808a12c:   ldr     r1, [pc, #20]   ; (0x808a144 <__assert_func+52>)
0808a12e:   bl      0x808a5f4 <fiprintf>
0808a132:   bl      0x808a100 <abort>
0808a136:   ldr     r3, [pc, #16]   ; (0x808a148 <__assert_func+56>)
0808a138:   mov     r2, r3
0808a13a:   b.n     0x808a122 <__assert_func+18>
0808a13c:   str     r0, [r3, #120]  ; 0x78
0808a13e:   movs    r0, #0
0808a140:   add     r12, r11
0808a142:   lsrs    r2, r1, #32
0808a144:   add     r12, sp
0808a146:   lsrs    r2, r1, #32
0808a148:   add     r8, sp
0808a14a:   lsrs    r2, r1, #32

显示 80a5198 是以下地址的 lss 文件_etext

0808a0c0 <abort>:
808a0c0:    b508        push    {r3, lr}
808a0c2:    2006        movs    r0, #6
808a0c4:    f001 ff6a   bl  808bf9c <raise>
808a0c8:    2001        movs    r0, #1
808a0ca:    f01b f865   bl  80a5198 <_etext>
808a0ce:    bf00        nop
4

0 回答 0