MSVC生成PE32+文件时是否可以移除异常表.pdata节?
移除x64/ARM64 PE文件.pdata节的可行方案
- 针对C/C++代码的编译链接配置:
- 编译阶段给cl.exe添加参数:
/EHs-c- /GS-,前者完全禁用C++异常和结构化异常处理,避免编译器生成异常处理相关元数据;后者禁用栈安全检查,消除栈检查逻辑附带的异常表依赖 - 链接阶段给link.exe添加参数:
/ENTRY:<自定义入口函数名> /NODEFAULTLIB /REMOVE:.pdata,跳过默认CRT入口初始化逻辑(CRT默认自带.pdata内容),同时直接指定链接时移除.pdata节
- 编译阶段给cl.exe添加参数:
- 针对ml64汇编代码的配置:
不要使用带帧注解的PROC FRAME过程声明,仅使用普通PROC声明函数,同时不要手动定义.pdata、.xdata段,汇编器就不会自动生成PDATA相关条目插入输出文件
重要提醒:仅当你100%确认程序运行全程不会触发任何需要栈展开的场景时,才能移除.pdata节,包括但不限于不抛出C++异常、不会触发访问违规等系统异常、不需要调试器栈展开调试。否则程序触发异常时会直接崩溃,极端情况会出现Windows系统拒绝加载PE文件的问题。
内容的提问来源于stack exchange,提问作者Steven Liang
相关产品推荐
相关产品推荐

