Какова структура записи.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
1 ответ
Если у вас пропущен порядок байтов, применяется следующее. Некоторая информация, вероятно, полезна, даже если порядок байтов в вашем исходном примере правильный.
extab
а также exidx
разделы, добавленные AAPCS, который является более новым ARM ABI.
Для более старых APCS указатель кадра или fp
является корнем связанной активной подпрограммы обратно к основной подпрограмме (или _start). С помощью AAPCS записи создаются и помещаются в exidx
а также extab
разделы. Это необходимо для раскрутки стеков (и ресурсов), когда fp
используется в качестве общего регистра.
exidx
упорядоченная таблица стандартных начальных адресов и extab
индекс (или не может размотаться). PC
(счетчик программы) можно просматривать и искать в таблице, чтобы найти соответствующие extab
запись.
В документации ARM EHABI есть раздел 6, посвященный записям таблицы обработки исключений. Это extab
записи, и вы можете, по крайней мере, начать оттуда, чтобы узнать больше. Есть два определенных,
- Общий (или C++)
- ARM compact
Компактная модель будет использоваться для большей части кода "С". В стеке нет объектов, подлежащих уничтожению, как в C++. Гекс 8003aab0
дает,
1000
б для ведущего клев, так что это компактно.0000
б для индекса. Su16-Short03
h - всплывает 16 байтов, некоторые локальные или дополнения.aa
ч - поп r4-r6b0
ч - финиш
В таблице 4, определенные ARM инструкциями по разворачиванию кадров приведены данные по размотке каждого байта.
Следующим является 0x002c002a
что компенсирует общую личность рутины. Следующими четырьмя значениями должны быть 8.2 структуры данных, которые имеют размер и должны быть равны нулю... Далее будет шаг, а затем информация о типе объекта в четыре байта. Смещение 0x2c002a будет вызывать деструктор объектов или какую-то оболочку для этого.
Я думаю, что весь код C++ предназначен для использования этого общего метода. Другие методы предназначены для разных языков, а НЕ для компиляторов.
Связанные вопросы и ссылки:
- Arm Exidx - о Exidx.
- Ссылка ARM и указатель кадра - ситуация для старых APCS и многих функций AAPCS.
- Linux ARM Unwind - пример кода раскручивания для 'C'.
- prel31 - SO Q / A на prel31 в коде Linux выше.
- Генерация раскрутки в ARM GNU ассемблере
- Газовые директивы АРМ См.:
.cantunwind
,.vsave
, и т.д.