c++ - gcc objdump - .ARM.exidx.text 部分是什么

标签 c++ gcc binaryfiles

我需要找出一个特定的 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 指令,因此它们的内容无法反汇编,并且您在反汇编中看到的 andeqandhi 指令具有误导性(-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/

相关文章:

c++ - 无法用gcc打开图形文件gcov

c - 警告输出末尾的 gcc 警告标志。这是什么意思?

php - 使用php将文件部分下载到服务器

c - 如何在二进制 gtk 应用程序中嵌入 `.ui` 文件?

c++ - 带有堆的 Bellman-Ford 不适用于自定义比较功能

c++ - 关于 MySQL++、GPL 和 LGPL

c++ - clang 不编译我的代码,但 g++ 可以

c++ - 使用 omp_set_num_threads 后,我可以使 OpenMP 恢复到理想的线程数吗?

c - 如何在 Linux 中链接和编译 .so 文件

c++ - 向/从二进制文件写入/读取 std::set< T >