对于设置传统帧指针的函数,是否有简单的DWARF CFI表示?

时间:2017-10-31 00:51:53

标签: debugging x86 nasm backtrace dwarf

我使用C,C ++和汇编语言进行编程,我希望从代码的任何部分获得可靠的回溯。

这主要适用于C和C ++代码,因为我可以使用-g生成调试信息,这对于现代x86编译器和平台生成DWARF调试信息,这意味着最终的二进制文件包含CFI(调用框架信息)。此信息允许通过当前调用堆栈中的函数向后移动。它可以支持复杂的场景,例如没有基指针的函数以及rsp动态方式的变化。对于C和C ++代码,我不必关心:编译器只需为优化代码生成正确的CFI。

对于我在nasm中编写的x86汇编代码,CFI是个问题。 nasm和语法兼容的竞争对手yasm对生成DWARF信息有一些有限的支持,但它主要涉及指向行映射的指令指针,并且dons包含任何CFI 1 (实际上是一个程序集)即使它需要,也无法真正产生这个,因为汇编太低而无法明确地表达调用/返回语义。

我想为程序集生成的例程添加CFI,但我不需要CFI的完全灵活性来根据对rsp的指令细化更改来识别CFA on:我很高兴为每个汇编函数在rbp中设置一个标准的帧指针,并为整个函数保留原样。 DWARF3是否通过一小段CFI信息支持这种情况,希望我能用汇编器宏生成一个?

1 实验" nextgen" version yasm确实支持CFI指令,但该项目在5年内没有更新。有open issue将此支持移回yasm的主线版本。

0 个答案:

没有答案