Gcc 为什么_exit()会跳转到_etext?

Gcc 为什么_exit()会跳转到_etext?,gcc,arm,system-calls,stm32,newlib,Gcc,Arm,System Calls,Stm32,Newlib,我在使用newLib的stm32微控制器上运行一个使用的项目 我调用了assert(false)来测试assert输出,并以硬故障异常结束。我调试了assert(…)的程序集,发现对\u exit(1)的后续调用跳转到一个名为\u etext的地址。请查看显示的\u etext是.text部分末尾的地址 我真的很困惑。通常我假设\u exit()正在调用\u exit()(newLib将其定义为全局符号),这是我在名为syscalls.c的文件中实现的 为什么\u exit()跳转到\u ete

我在使用newLib的stm32微控制器上运行一个使用的项目

我调用了
assert(false)
来测试assert输出,并以硬故障异常结束。我调试了
assert(…)
的程序集,发现对
\u exit(1)
的后续调用跳转到一个名为
\u etext
的地址。请查看显示的
\u etext
是.text部分末尾的地址

我真的很困惑。通常我假设
\u exit()
正在调用
\u exit()
(newLib将其定义为全局符号),这是我在名为
syscalls.c
的文件中实现的

为什么
\u exit()
跳转到
\u etext

以下是一些cope代码片段,以便更好地理解:

assert()
\u exit()
的后续调用取自newLib 2.5:

_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
的反汇编。请特别注意地址0808a10a,其中执行跳转到80a5198(
\u 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

六羟甲基三聚氰胺六甲醚。。。您确定在
\u exit()
系统调用的实现中需要双下划线吗?你能试着把它重命名为
\u exit()
看看这是否能解决问题吗?
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