gcc objdump - 什么是节.ARM.exidx.text

时间:2016-08-16 20:11:07

标签: c++ gcc binaryfiles

我需要找出我的.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,我可以看到错误的名称与QHashQStringQHashData有关。 。 。

问题

我如何确定地将此部分映射到特定的部分。 。 。无论是代码还是调试信息或。 。 。无论如何我都知道影响这个特定字节的是什么。

1 个答案:

答案 0 :(得分:0)

在ARM目标文件中,名为.ARM.exidx.text。*的节包含异常索引表。该表中的每个条目都包含正在编译的代码中的函数与其异常处理代码之间的关联;换句话说,每个条目都指定了在函数执行过程中引发异常时(或在其他情况下需要在正常代码执行路径之外展开函数调用堆栈帧的情况)应该发生的情况。这些部分不包含ARM或Thumb指令,因此无法对其内容进行反汇编,并且在反汇编中看到的andeqandhi指令具有误导性(您可以使用-D选项传递给objdump会使它反汇编所有对象节的内容,即使它们不包含指令也是如此。

在您的情况下,您正在查看与Qt库中的QHash类的deleteNode()方法相关联的帧展开指令。这些指令的格式在用于ARM体系结构的异常处理ABI中定义(可从http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf下载),特别是在文档的9.3节中。