Что.seh * команды сборки, которые выводит gcc?
Я использую gcc-S для программы hello world. Каковы 5 .seh_ команды? Я не могу найти много информации о них, когда я ищу.
.file "hi.c"
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "Hello World"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq , %rsp
.seh_stackalloc 32
.seh_endprologue
call __main
leaq .LC0(%rip), %rcx
call puts
movl , %eax
addq , %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (rubenvb-4.8.0) 4.8.0"
.def puts; .scl 2; .type 32; .endef
3 ответов
это gas
реализация MASM's обработка кадров pseudos для генерации исполняемого файла .pdata и .разделы xdata (структурированная обработка исключений). Кроме того, проверить Raw Псевдо Операции. По-видимому, если ваш код может быть в стеке во время операции размотки SEH, вы должны использовать их.
нашел немного подробнее https://sourceware.org/ml/binutils/2009-08/msg00193.html. Этот поток, похоже, является оригинальной проверкой на gas
добавить поддержку для всех .set_ * псевдо ops.
Я хотел бы показать патч для .pdata и .поколения данных XData из pe-coff цели через газ, и получить некоторую обратную связь. Этот патч включает поддержку arm, ppc, arm, sh (3&4), mips и x64. Что касается x86 нет поддержки ОС для информации о функциях времени выполнения, я пощадил эта часть. Он просто увеличит размер исполняемого файла для x86 PE и там никакой реальной выгоды для этой цели.
краткое описание:
На данный момент существует три различных предустановленных формата ввода функций.первый является MIPS один. Вторая версия для ARM, PPC, SH3, и SH4 в основном для Windows CE. Третий-версия IA64 и x64. Обратите внимание, что IA64 еще не реализован, но чтобы найти информацию о это, пожалуйста, см. спецификацию о Для ia64 на http://download.intel.com/design/Itanium/Downloads/245358.pdf файл.
первая версия имеет только записи в разделе pdata: BeginAddress, EndAddress, ExceptionHandler, HandlerData и PrologueEndAddress. Каждое значение является указателем на соответствующие данные и имеет размер 4 байты.
второй вариант имеет следующие записи в разделе pdata. BeginAddress, PrologueLength (8 бит), EndAddress (22 бита), Use-32-bit-instruction (1 бит) и Exception-Handler-Exists (1 бит). Если FunctionLength равен нулю, или бит exists обработчика исключений true, блок DATA_EH помещается непосредственно перед входом функции.
третья версия имеет блок ввода функции BeginAddress (RVA), EndAddress (RVA) и UnwindData (RVA). Описание пролог, excepetion-обработчик, и дополнительные данные сех хранится в поле UNWIND_DATA в разделе xdata.
.seh_proc
Это указывает, что блок SEH начинается для функции. Это действительно для всех цели. .seh_endprologue
По этому псевдо местоположение конца пролога-адрес (берется по текущему кодовому адресу внешнего вида это псевдо). Действует для всех целей..seh_handler
[, ]
Это псевдо определяет используемая функция обработчика. Для версии 2 поле обработчик-данные указывает необязательный блок данных пользователя. Для версии 3 поле обработчик-данные может быть rva для пользовательских данных( для FHANDLER), если имя @unwind генерируется блок uhandler unwind, и если он is @except (или не указан вообще) блок исключения EHANDLER сгенерированный..seh_eh
Этот псевдоним используется для версии 2 для указания местоположения функции begin в сборке. Вот данные PDATA_EH это может храниться до..seh_32/.seh_no32
Эти псевдонимы используются только для версии 2 (см. описание выше). На данный момент он по умолчанию no32, если нет указанный..seh_endproc
Этим псевдо указывается конец блока SEH..seh_setframe
,
По этому псевдо фрейм-регистр и смещение (значение между 0-240 с 16-байт выравнивание) можно указать. Это только для версии 3..seh_stackalloc
Это распределение стека в коде описано для версии 3..seh_pushreg
Этим общий регистр push в коде описывается для версии 3..seh_savereg
Этим описан общий регистр сохранить в память в коде для версии 3..seh_savemm
Этим регистр mm сохранить в память в коде описывается для версии 3..seh_savexmm
Этим регистр xmm сохранить в память в коде описывается для версии 3..seh_pushframe
Эта информация о виде записи может быть описана для версии 3..seh_scope ,, ,
По этой области записи для размотки или исключения могут быть указаны для версия 3. Это справедливо только для UHANDLE и EHANDLER xdata необходимо указать дескриптор и глобальный обработчик. Для обработчика и можно использовать аргументы перехода, имена @1,@0 и @null, и они указание, что вместо rva должна использоваться константа.
есть также некоторые жесткие обсуждения.xdata and .pdata (вместе с кучей ссылки) at https://sourceware.org/ml/binutils/2009-04/msg00181.html.
Я остановил их от вывода с помощью:
gcc -S -fno-asynchronous-unwind-tables hi.c
Так что я могу посмотреть это. Но я доволен тем, что их больше нет.