ZHCADC3B February 2019 – October 2023
当源代码中出现抛出语句时,编译器会对名为 _ _cxa_throw 的运行时支持库函数生成调用。当执行抛出时,_ _cxa_throw 调用点的返回地址用于识别哪个函数正在抛出异常。库会在 EXIDX 表中搜索返回地址。
表中的每个条目分别代表一个程序地址范围的异常处理行为,它们可能是一个或多个有着完全相同异常处理行为的函数。每个条目分别对程序地址范围的开头进行编码,并且视为覆盖所有程序地址,直到下一个条目中编码的地址为止。链接器可以将行为相同的相邻函数组合到一个条目中。
每个条目由两个 32 位字组成。每个条目的第一个字是 PREL31 字段,代表一个或多个函数的起始程序地址。第一个字的第 31 位应为 0。第二个字有三种格式,取决于第二个字的第 31 位。如果第 31 位为 0,则第二个字是 PREL31 指针(指向存储器中其他位置的 EXTAB 条目),或者是特殊值 EXIDX_CANTUNWIND。如果第 31 位为 1,则第二个字是内联 EXTAB 条目。后续各小节将详细介绍这三种格式。