为什么_exit()跳转到_etext?

时间:2018-06-14 06:32:11

标签: gcc arm system-calls stm32 newlib

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

我调用assert(false)来测试断言输出并以硬故障异常结束。我调试了assert(...)的程序集,发现随后对_exit(1)的调用会跳转到名为_etext的地址。看一看manpage of _etext表明_etext是.text部分结尾的地址。

我真的很困惑。通常我假设_exit()正在调用__exit()(由newLib定义为全局符号),我在名为syscalls.c的文件中实现了它。

为什么_exit()会跳转到_etext

以下是一些更好理解的应对措施:

_exit()后来对来自newLib 2.5的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);
    }
}

abortassert的反汇编。请特别注意地址0808a10a,其中跳转到80a5198(_etext):

        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

lss文件显示80a5198是_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

0 个答案:

没有答案