我需要找出一个特定的 BYTE - .obj
地址 0x584a7
- 在我的 .obj
中被映射到什么是负责的用于生成它(代码/调试信息/等)。
我已成功运行 objdump -xSsDg
在我的 .obj
文件上。
查看输出,我确定了引用该字节的区域:
第一部分:注意地址是 0x584a0
,大小是 8
所以这就是我感兴趣的字节( 0x584a7
)
1012 .ARM.exidx.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE 00000008 00000000 00000000 000584a0 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
...
第二部分:使用十六进制编辑器,我确定此数据 - 00000000 00000080
- 与我的实际 .obj
文件匹配。行首的前四个 0
表示此部分的偏移量,它本身从 0x584a0
Contents of section .ARM.exidx.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE:
0000 00000000 00000080 ........
...
第三部分:看起来像代码但不确定是什么。
Disassembly of section .ARM.exidx.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE:
00000000 <.ARM.exidx.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE>:
0: 00000000 andeq r0, r0, r0
0: R_ARM_PREL31 .text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE
0: R_ARM_NONE __aeabi_unwind_cpp_pr1
4: 80000000 andhi r0, r0, r0
4: R_ARM_PREL31 .ARM.extab.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE
所以我有我的 .cpp
和 .obj
并且我可以看到损坏的名称与 QHash
有关, QString
, QHashData
。 . .
问题
我如何最终将此部分映射到特定的 . . .事情是代码或调试信息或。 . .无论如何,这样我就可以知道是什么影响了这个特定的字节。
最佳答案
在 ARM 对象文件中,名为 .ARM.exidx.text.* 的部分包含异常索引表。此表中的每个条目都包含正在编译的代码中的函数与其异常处理代码之间的关联;换句话说,每个条目指定在函数执行期间抛出异常时应该发生什么(或者在函数调用堆栈框架需要在正常代码执行路径之外展开的其他情况下)。这些部分不包含 ARM 或 Thumb 指令,因此它们的内容无法反汇编,并且您在反汇编中看到的 andeq
和 andhi
指令具有误导性(-D
您传递给 objdump 的选项使它反汇编所有对象部分的内容,即使它们不包含指令)。
在您的例子中,您正在查看与 Qt 库中 QHash 类的 deleteNode() 方法关联的帧展开指令。这些指令的格式在 ARM 架构的异常处理 ABI 中定义(可在 http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf 下载),特别是文档的第 9.3 节。
关于c++ - gcc objdump - .ARM.exidx.text 部分是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38983629/