我需要找出我的.obj
中特定的BYTE - 0x584a7
地址.obj
被映射到什么,即负责生成它(代码/调试信息/等)
我已在.obj
文件上成功运行objdump -xSsDg
。
查看输出,我已经确定了引用该字节的区域:
第一部分:请注意地址为0x584a0
且尺寸为8
,因此这包含了我感兴趣的字节(0x584a7
)
1012 .ARM.exidx.text._ZN5QHashI7QStringiE11deleteNode2EPN9QHashData4NodeE 00000008 00000000 00000000 000584a0 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
...
第二部分:使用十六进制编辑器,我发现此数据 - 00000000 00000080
- 与我的实际.obj
文件相匹配。该行开头的前四个0
表示此部分的偏移INTO,它本身从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
有关。 。 。
问题
我如何确定地将此部分映射到特定的部分。 。 。无论是代码还是调试信息或。 。 。无论如何我都知道影响这个特定字节的是什么。
答案 0 :(得分:0)
在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节中。