我用gcc -S制作了一个hello world程序。5 .seh_命令是什么?当我搜索的时候,我似乎找不到很多关于他们的信息。
.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发布于 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上也有一些核心讨论。
发布于 2013-12-28 22:55:45
我通过以下方法阻止了它们的输出:
gcc -S -fno-asynchronous-unwind-tables hi.c这样我就能查出来了。但我很高兴不再有他们的输出了。
发布于 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
https://stackoverflow.com/questions/20819927
复制相似问题