是否可以在目标文件上生成 unwind table

Is it possible to generate unwind table on an object file

背景是我们有一个没有 unwind 的预构建目标文件 table,但不知何故 gcc unwind 在对象回溯时遇到了问题。是否可以在没有源代码的情况下生成 unwind table?考虑到 unwind table 是基于堆栈静态的,即使没有源代码也可用。

一般来说,不可能从目标文件中的机器代码生成正确的展开 tables。首先,一些结构很难在展开信息中准确表示。 Retpolines 就是一个例子。

更大的实际问题是 DWARF 展开信息是按函数构建的。一个裸目标文件(没有调试信息,只有一个最小的符号 table)不捕获函数边界信息。否则,就无法判断文件中的某个位置是否是函数调用的目标和函数的开始。类似地,对 noreturn 函数的调用可能是函数中的最后一条指令,即使它后面没有跟 return 指令。可以使用重定位数据。有几种工具试图推断函数边界;每个反汇编程序都在某种程度上做到了。

最好的办法是找到展开失败的函数并找出原因,然后使用自定义编写的展开数据或 GDB 插件进行补偿。由于,完整的转换会相当乏味。