存在哪种类型的堆栈展开库以及';有什么区别? 试图建立自己的非GNU跨平台C++环境,我面临的事实是,我不真正理解堆栈展开的基本知识。我构建的环境如下所示:

存在哪种类型的堆栈展开库以及';有什么区别? 试图建立自己的非GNU跨平台C++环境,我面临的事实是,我不真正理解堆栈展开的基本知识。我构建的环境如下所示:,c++,linux,llvm,cpu-architecture,stack-unwinding,C++,Linux,Llvm,Cpu Architecture,Stack Unwinding,libc++← libc++abi← libunwind(或其他一些退绕机) 我发现libc++abi已经包含了某种libunwind,但在Linux上没有使用它。从我的评论中,我了解到这是一个特殊的libunwind:LLVM堆栈展开器,它只支持Darwin和ARM,而不支持x86_64,这让人困惑。CPU架构如何影响堆栈展开过程 此外,我还了解以下堆栈展开器: 内置glibc libc++abi LLVM libunwind GNU LIBUNND(来自大草原) 问题: 平台或CPU架构如

libc++
← <代码>libc++abi←
libunwind
(或其他一些退绕机)

我发现
libc++abi
已经包含了某种libunwind,但在Linux上没有使用它。从我的评论中,我了解到这是一个特殊的libunwind:LLVM堆栈展开器,它只支持Darwin和ARM,而不支持x86_64,这让人困惑。CPU架构如何影响堆栈展开过程

此外,我还了解以下堆栈展开器:

  • 内置glibc
  • libc++abi LLVM libunwind
  • GNU LIBUNND(来自大草原)

  • 问题:
  • 平台或CPU架构如何影响堆栈展开过程
  • 为什么要有许多卷取机-而不是一个卷取机
  • 存在哪种退绕机?它们之间有什么区别

  • 对答案的期望:
    我希望得到的答案能涵盖整个主题,而不仅仅是每个问题上的独立点。

    从根本上说,堆栈布局取决于编译器。它几乎可以用它认为最好的任何方式来布置堆栈。语言标准没有说明堆栈的布局方式

    实际上,不同的编译器以不同的方式布置堆栈,同一个编译器在使用不同选项运行时也可以以不同的方式布置堆栈。堆栈布局将取决于目标平台上类型的大小(尤其是指针类型的大小)、编译器选项(如GCC的
    -fomit frame pointer
    )以及平台的ABI要求(例如x64具有定义的ABI,而x86没有)。如何解释堆栈还取决于编译器如何存储相关信息。这反过来又部分取决于可执行文件格式(现在可能是ELF或COFF,但实际上,只要操作系统能够加载可执行文件并找到入口点,其他的一切都很容易掌握),部分取决于调试信息格式,这同样是特定于所使用的编译器/调试器组合的。最后,完全有可能编写内联汇编程序,以一种任何退绕机都无法遵循的方式操纵堆栈和程序流。一些编译器还允许您自定义函数序言和尾声,这给了您另一个混淆任何展开算法的机会


    所有这些的最终效果是,不可能编写一个在任何地方都能工作的单堆栈展开算法。展开算法必须与编译器、操作系统以及调试器相匹配,而不仅仅是最基本的信息。您最好编写一个简单的堆栈展开接口,并针对您支持的每个编译器/操作系统/调试器组合以不同的方式实现它。

    #关于StackOverflow,3类问题被认为是离题的。@DonReba您能给我指一下相应的元帖子吗?-我曾经问过这样的问题,在这里和那里都见过#4@DonReba你是指这一部分吗?:
    问题要求我们推荐或查找一本书、工具、软件库、教程或其他非现场资源
    ——那么我看不出这如何适用于我的问题。顺便问一下,
    #3类问题
    -你是指包含另外3个子问题的问题还是其他问题?我指的是要求推荐unwinder库的问题,即子问题#3。