Что.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

Так что я могу посмотреть это. Но я доволен тем, что их больше нет.


они, похоже, связаны с обработкой исключений. Это все, что я смог найти.

http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/external/gpl3/binutils/dist/gas/config/obj-coff-seh.h