我将gcc -S用于世界程序。 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
最佳答案
这些是MASM frame handling pseudos的gas
实现,用于生成可执行文件的.pdata和.xdata节(结构化异常处理内容)。还要检查Raw Pseudo Operations。显然,如果您的代码可能在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没有OS支持运行时功能信息,我幸免于难
这部分。这只会增加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位),
使用32位指令(1位)和异常处理程序存在(1位)。
如果FunctionLength为零,或者Exception-Handler-Exists位为
的确,在函数输入之前直接放置了一个DATA_EH块。
第三个版本具有BeginAddress(RVA)的功能输入块,
EndAddress(RVA)和UnwindData(RVA)。的描述
序言,例外处理程序和其他SEH数据存储在其中
xdata部分中的UNWIND_DATA字段。
.seh_proc
这指定SEH块开始于功能。这对所有人都有效
目标。
.seh_endprologue
通过此伪指令,序言结束地址的位置(由出现的当前代码地址获取)
此伪)。对所有目标均有效。
.seh_handler [,]
该伪指令指定要使用的处理函数。对于版本2
handler-data字段指定用户可选的数据块。对于版本
3如果以下情况,处理程序数据字段可以是用户数据的rva(对于FHANDLER)
名称为@unwind,将生成UHANDLER展开块,如果生成的话
是@except(或根本没有指定)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 ,,,
通过此SCOPED条目可以展开或指定例外
版本3。这仅对UHANDLE和EHANDLER xdata有效
描述符和全局处理程序必须指定。对于处理程序和
跳转参数,可以使用@ 1,@ 0和@null的名称,它们分别是
指定必须使用常量而不是rva。
在https://sourceware.org/ml/binutils/2009-04/msg00181.html处也对.xdata和.pdata(以及许多链接)进行了一些硬性讨论。
关于gcc - gcc输出的.seh_ *汇编命令是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20819927/