【问题标题】:Is it possible to generate unwind table on an object file是否可以在目标文件上生成展开表
【发布时间】:2019-03-02 06:55:23
【问题描述】:

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

【问题讨论】:

  • gcc 还是 gdb? gcc 不应该展开任何事情。我假设 gdb 或类似的工具。而且我认为这与异常处理无关(在这种情况下,您确实需要足够的展开信息才能使代码正常工作,更不用说可调试了)。如果您可以准确地反汇编目标文件并插入足够多的 CFI 指令并将其组装回来,那么您应该能够纠正这种情况。视情况而定,这可能是不切实际的乏味。
  • 感谢您的回复。我的意思是当 -funwind-table 传递给 GCC 时在目标文件中生成的展开表。
  • @AlexeyFrunze 关于准确反汇编目标文件,这是一个有趣的观点。是否可以将对象分解为 asm 文件并重新组装回来?
  • 在here 周围寻找项目、论文和想法。
  • @AlexeyFrunze 谢谢。

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


【解决方案1】:

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

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

最好的办法是找出无法展开的函数并找出原因,然后使用自定义编写的展开数据或 GDB 插件来弥补这一点。作为Alexey Frunze said,完全转换会比较繁琐。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多