2

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

4

1 回答 1

2

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

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

最好的办法是找到无法展开的函数并找出原因,然后使用自定义编写的展开数据或 GDB 插件进行补偿。正如Alexey Frunze 所说,完全转换将相当乏味。

于 2019-03-20T08:46:14.373 回答