热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用-funwind-tables进行编译时到底发生了什么?

如何解决《使用-funwind-tables进行编译时到底发生了什么?》经验,为你挑选了1个好方法。

来自:https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html

-fexceptions:启用异常处理.生成传播异常所需的额外代码.对于某些目标,这意味着GCC为所有函数生成帧展开信息,

-funwind-tables类似于-fexceptions,它只是生成任何所需的静态数据,但不会以任何其他方式影响生成的代码.您通常不需要启用此选项; 相反,需要此处理的语言处理器代表您启用它.

有人可以解释一下-funwind-tables"任何需要的静态数据"是什么意思.他们指的是什么数据.为什么需要生成数据?如果没有生成数据会怎么样?这些数据用于哪里?

它也说"类似于-fexception".所以我认为它也会生成帧展开信息.什么是帧展开信息?谁使用框架信息以及如何使用?

在一些SO帖子中,我读到必须使用此标志编译程序_Unwind_Backtrace才能正常工作.请解释如何_Unwind_Backtrace使用生成的信息-funwind-tables.



1> Francesco La..:

为该-funwind-tables选项提及的静态数据是帧展开信息,即,允许正在运行的程序从给定执行点向后退功能调用堆栈的数据。向后走函数调用栈意味着从被调用函数的执行上下文移到调用者的上下文,即从函数返回时通常会发生的情况,除了框架展开信息允许您从内部的任意点进行操作。功能主体;同样,您也不必递归地退出调用函数,您可以简单地“窥视”调用者上下文(例如,检索已调用函数的位置),然后继续执行正常的执行流程。称为函数。

为了实现上述目的,您需要获得有关编译后代码的更多信息,而不是程序遵循“正常”执行流程所必需的信息。该信息(即帧展开信息)由链接器放置在专用于此目的的特殊链接器部分(例如,x86平台的.eh_frame部分或ARM平台的ARM.exidx和.ARM.extab部分)中;这些链接器部分与C ++等语言中实现异常处理所需的部分相同,在这种情况下,由于引发异常,执行流可能从被调用函数跳转到其调用者。如果使用-fno-unwind-tables选项禁用了此数据的生成,则将无法向后退函数调用堆栈或使用C ++异常。

值得注意的是,框架unwind信息由libunwind使用,libunwind是一个跨平台的库,它支持生成回溯,跳转到调用堆栈中的任意点等等。

_Unwind_Backtrace()是在GCC核心库(更具体地在libgcc_s中)中实现的函数,该函数允许为调用堆栈中的每个帧执行回调函数(作为参数提供),即从调用者函数的上下文开始,移至其调用者,等等。参见https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/baselib--unwind-backtrace.html。同样,此功能要能够完成工作,还需要从相应的链接器部分访问帧展开信息。


推荐阅读
author-avatar
mobiledu2502909745
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有