Почему _exit () переходит на _etext?

Я запускаю проект с использованием 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() и посмотреть, решит ли это проблему?

Pinetwig 26.06.2018 18:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
151
0

Другие вопросы по теме