Я запускаю проект с использованием ARM Embedded Tollchain на микроконтроллере stm32, который использует newLib.
Я позвонил в assert(false), чтобы проверить вывод assert, и в результате возникла исключительная ситуация с аппаратной ошибкой. Я отлаживал сборку assert(...) и обнаружил, что последующий вызов _exit(1) переходит на адрес, который называется _etext. Взглянув на справочная страница _etext, можно увидеть, что _etext - это адрес конца секции .text.
Я действительно сбита с толку. Обычно я предполагал, что _exit() вызывает __exit() (который определяется как глобальный символ в newLib), который я реализовал в файле с именем syscalls.c.
Почему _exit() переходит на _etext?
Вот несколько фрагментов кода для лучшего понимания:
Последующий вызов _exit() со стороны assert(), взятый из 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 (_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





Хммм ... Вы уверены, что вам нужны двойные подчеркивания в вашей реализации системного вызова
__exit()? Не могли бы вы попробовать переименовать его в_exit()и посмотреть, решит ли это проблему?