是否可以在目标文件上生成展开表

时间:2019-03-02 06:55:23

标签: gcc compiler-construction binutils dwarf stack-unwinding

背景是我们有一个没有展开表的预建目标文件,但是gcc展开以某种方式在对象上回溯时遇到了问题。没有源代码是否可以生成展开表?考虑到展开表是基于堆栈的静态数据,即使没有源代码也可以使用。

1 个答案:

答案 0 :(得分:2)

通常,无法从目标文件中的机器代码生成正确的展开表。首先,在解释信息时,某些构造很难准确表示。反射线就是一个例子。

更大的实际问题是DWARF展开信息是按功能构造的。裸对象文件(没有调试信息,只有最小的符号表)不会捕获功能边界信息。否则,就无法确定文件中的位置是否是函数调用和函数启动的目标。同样,对noreturn函数的调用可能是函数中的最后一条指令,即使后面没有返回指令也是如此。可能使用重定位数据。有几种工具可以推断功能边界。每个反汇编程序都会在一定程度上做到这一点。

您最好的选择是找到无法平仓的函数,找出原因,然后使用自定义编写的平仓数据或GDB插件对此进行补偿。与Alexey Frunze said一样,完全转换将非常繁琐。