Какова структура записи .arm.extab в armcc?

Я пытаюсь понять, как именно работает таблица исключений (.arm.extab). Я знаю, что это зависит от компилятора, поэтому я ограничусь armcc (поскольку я использую Keil).

Типичная запись в таблице выглядит примерно так: b0aa0380 2a002c00 01000000 00000000

Насколько я понимаю, первое слово кодирует инструкции для подпрограммы личности, а третье слово — это перемещение R_ARM_PREL31 в начало блока catch.

Что меня сбивает с толку, так это второе слово — кажется, что оно разделено на 2 шорта, второй из которых измеряет некоторое расстояние от начала функции метания, но я точно не знаю, к чему (и что делает первый шорт).

Есть ли место, где документирована структура этих записей?

Я нашел 2 соответствующих документа, но, насколько я понимаю, в них нет информации, зависящей от компилятора, поэтому их недостаточно: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf


person Tal Ben-Porath    schedule 11.08.2019    source источник
comment
Вы уверены, что у вас правильный порядок байтов. То есть первое значение 0xb0aa0380, а не litte-endian 0x8003aab0?   -  person artless noise    schedule 11.08.2019
comment
Я обнаружил, что и g++, и clang используют «общий» метод. Например, _Unwind_Control_Block.exception_class — это GNUCC++\0, CLNGC++\0 или ARM\0C++\0. clang, gcc Это допускает работоспособность. В libgcc/libsupc++ есть конфигурация для изменения метода исключения, но по умолчанию используется тот, что указан в документе ehabi. Я не понимаю, зачем keil делать что-то еще, но это возможно.   -  person artless noise    schedule 13.08.2019


Ответы (1)


Если вы случайно пропустили порядок байтов, применяется следующее. Некоторая информация, вероятно, будет полезна, даже если порядок байтов в исходном примере правильный.


extab и exidx — это разделы, добавленные AAPCS, который является более новым ARM ABI.

Для более старых APCS указатель кадра или fp является корнем ссылки активной процедуры обратно на основную процедуру (или _start). С помощью AAPCS записи создаются и размещаются в разделах exidx и extab. Они необходимы для очистки стеков (и ресурсов), когда fp используется в качестве универсального регистра.

exidx представляет собой упорядоченную таблицу начальных адресов подпрограмм и индекс extab (или не может раскручиваться). PC (счетчик программ) можно просмотреть и выполнить поиск по таблице, чтобы найти соответствующую запись extab.

В документации ARM EHABI есть раздел 6. в разделе Записи таблицы обработки исключений. Это extab записей, и вы можете хотя бы начать с них, чтобы узнать больше. Есть два определенных,

  1. Общий (или С++)
  2. АРМ компактный

Модель compact будет использоваться для большей части кода на языке C. В стеке нет объектов, подлежащих уничтожению, как в C++. Шестигранник 8003aab0 дает,

  • 1000b для ведущего полубайта, так что это компактно.
  • 0000b для индекса. Su16—короткий
  • 03h — извлечь 16 байт, некоторые локальные переменные или отступы.
  • aah - поп r4-r6
  • b0h - финиш

Таблица 4, Определенные ARM инструкции раскручивания кадра содержат данные раскручивания каждого байта.

Следующим является 0x002c002a, который является смещением к общему подпрограмме личности. Следующие четыре значения должны быть 8.2 Data Structures, которые представляют собой размер и должны быть равны нулю... Следующим будет шаг, а затем четырехбайтовая информация о типе объекта. Смещение 0x2c002a должно вызывать деструктор объектов или какую-то оболочку для этого.


Я думаю, что весь код C++ предназначен для использования этого метода Generic. Другие методы предназначены для разных языков и компиляторов НЕ.

Связанные вопросы и ответы и ссылки:

person artless noise    schedule 11.08.2019