首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc输出的.seh_*组装命令是什么?

gcc输出的.seh_*组装命令是什么?
EN

Stack Overflow用户
提问于 2013-12-28 22:12:30
回答 3查看 4.5K关注 0票数 13

我用gcc -S制作了一个hello world程序。5 .seh_命令是什么?当我搜索的时候,我似乎找不到很多关于他们的信息。

代码语言:javascript
复制
    .file   "hi.c"
    .def    __main; .scl    2;  .type   32; .endef
    .section .rdata,"dr"
.LC0:
    .ascii "Hello World\0"
    .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    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    call    __main
    leaq    .LC0(%rip), %rcx
    call    puts
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (rubenvb-4.8.0) 4.8.0"
    .def    puts;   .scl    2;  .type   32; .endef
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-04 10:00:32

这些是gas帧处理伪实现,用于生成可执行文件的.pdata和.xdata部分(结构化异常处理材料)。还可以查看原始伪操作。显然,如果您的代码可能在SEH展开操作期间出现在堆栈中,则需要使用这些部分。

我在https://sourceware.org/ml/binutils/2009-08/msg00193.html上发现了更多的信息。这个线程似乎是对gas的原始签入,以添加对所有.set_*伪操作的支持。

我想展示的补丁.pdata和.xdata产生的pe-coff目标通过气体,并得到一些反馈。此修补程序包括对arm、ppc、arm、sh (3&4)、mips和x64的支持。至于x86,不支持运行时函数信息,我不支持这个部分。它只会增加x86 PE的可执行文件大小,而这个目标没有真正的增益。 简介: 目前有三种不同的函数输入格式预置。 第一个是MIPS。第二个版本主要用于Windows中的ARM、PPC、SH3和SH4。第三个是IA64和x64版本。注意,IA64尚未实现,但要查找有关它的信息,请参阅关于http://download.intel.com/design/Itanium/Downloads/245358.pdf文件上的IA64的规范。 第一个版本在pdata部分中只有条目: BeginAddress、EndAddress、ExceptionHandler、HandlerData和PrologueEndAddress。每个值都是指向相应数据的指针,大小为4个字节。 第二个变体在pdata部分中有以下条目。BeginAddress,PrologueLength (8位),EndAddress (22位),使用-32位指令(1位),异常处理程序-存在(1位).如果FunctionLength为零,或者异常-Handler-存在位为真,则在函数输入之前直接放置一个DATA_EH块。 第三个版本有一个函数输入块BeginAddress (RVA)、EndAddress (RVA)和UnwindData (RVA)。序言、超处理程序和附加SEH数据的描述存储在xdata部分的UNWIND_DATA字段中。 .seh_proc 这指定SEH块开始于函数。这对所有目标都有效。 .seh_endprologue 通过这个伪地址,序幕结束地址的位置(由这个伪的外观的当前代码地址获取)。对所有目标有效。 .seh_handler, 此伪指定要使用的处理程序函数。对于版本2,处理程序-数据字段指定用户可选数据块。对于第3版,处理程序-数据字段可以是用户数据的rva (对于FHANDLER),如果名称为@解卷,则生成UHANDLER展开块,如果它是@以外(或根本不指定),则生成EHANDLER异常块。 .seh_eh 此伪码用于版本2,用于指示函数在程序集中开始的位置。在这里,PDATA_EH数据可以存储到。 .seh_32/.seh_no32 这个伪码仅用于版本2(请参阅上面的描述)。目前,它默认为no32 (如果没有指定)。 .seh_endproc 通过这个伪,指定SEH块的结束。 .seh_setframe, 通过这个伪码,可以指定帧寄存器和偏移量(16字节对齐值在0-240之间)。这是版本3所使用的。 .seh_stackalloc 通过这个堆栈,代码中的分配被描述为第3版。 .seh_pushreg 在此基础上,描述了第3版的通用寄存器推送代码。 .seh_savereg 根据这一点,在第3版中描述了在代码中保存到内存中的普通寄存器。 .seh_savemm 根据这一点,在第3版中,用代码将mm寄存器保存到内存中。 .seh_savexmm 据此,描述了第3版的xmm寄存器在代码中保存到内存中。 .seh_pushframe 关于条目类型的信息可以在第3版中描述。 .seh_scope,,, 通过这个作用域,可以为版本3指定展开项或异常项。这对于UHANDLE和EHANDLER xdata描述符是有效的,并且必须指定全局处理程序。对于处理程序和跳转参数,可以使用@1、@0和@null的名称,它们指定必须使用常量而不是rva。

在.xdata和.pdata (以及一些链接)的https://sourceware.org/ml/binutils/2009-04/msg00181.html上也有一些核心讨论。

票数 11
EN

Stack Overflow用户

发布于 2013-12-28 22:55:45

我通过以下方法阻止了它们的输出:

代码语言:javascript
复制
gcc -S -fno-asynchronous-unwind-tables hi.c

这样我就能查出来了。但我很高兴不再有他们的输出了。

票数 9
EN

Stack Overflow用户

发布于 2013-12-28 22:21:47

它们似乎与异常处理有关。这就是我所能找到的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20819927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档