背景是我们有一个没有展开表的预建目标文件,但是gcc展开以某种方式在对象上回溯时遇到了问题。没有源代码是否可以生成展开表?考虑到展开表是基于堆栈的静态数据,即使没有源代码也可以使用。
答案 0 :(得分:2)
通常,无法从目标文件中的机器代码生成正确的展开表。首先,在解释信息时,某些构造很难准确表示。反射线就是一个例子。
更大的实际问题是DWARF展开信息是按功能构造的。裸对象文件(没有调试信息,只有最小的符号表)不会捕获功能边界信息。否则,就无法确定文件中的位置是否是函数调用和函数启动的目标。同样,对noreturn函数的调用可能是函数中的最后一条指令,即使后面没有返回指令也是如此。可能使用重定位数据。有几种工具可以推断功能边界。每个反汇编程序都会在一定程度上做到这一点。
您最好的选择是找到无法平仓的函数,找出原因,然后使用自定义编写的平仓数据或GDB插件对此进行补偿。与Alexey Frunze said一样,完全转换将非常繁琐。