Gcc 为什么_exit()会跳转到_etext?
我在使用newLib的stm32微控制器上运行一个使用的项目 我调用了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
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