2

所以最近我一直在查看我的 C++ 代码的反汇编,并且不得不手动跟踪每个寄存器中的内容,如下所示:

  95:   48 8b 16                mov    (%rsi),%rdx ; %rdx = raggedCross.sink
  98:   48 8b 42 38             mov    0x38(%rdx),%rax ; %rax = sink.table
  9c:   8b 4a 10                mov    0x10(%rdx),%ecx ; %ecx = sink.baseCol
  9f:   48 8b 70 50             mov    0x50(%rax),%rsi ; %rsi = table.starts
  a3:   89 c8                   mov    %ecx,%eax   ; %eax = baseCol
  a5:   83 c1 1c                add    $0x1c,%ecx  ; %ecx = baseCol + 1

等等。注释是我的,通过查找 C++ 类中各种字段(例如 sink、table、baseCol、starts)的偏移量手动添加的。

这很简单,但是乏味且耗时:对于程序来说,这是完美的事情。gdb 似乎知道结构中各个字段的偏移量:我可以做 &((Table *)0x1200)->starts 并告诉正确的地址。所以,这个信息就在身边。

是否有一些反汇编程序可以使用此信息为我注释代码?

如果做不到这一点,我可以自己写。gdb 从哪里获得偏移量?

4

3 回答 3

0

你可以看看IDA Pro。它不会完全自动化这个过程,但它至少可以让你在一个地方定义你的结构/类,它会从那里处理大多数事情。

于 2010-06-02T17:10:28.247 回答
0

GDB 使用您包含的调试信息来确定这类事情,它不是普通可执行文件的一部分;DWARF是一种用于存储调试信息的常用格式

于 2010-06-02T17:08:25.803 回答
0

您可以使用调试信息 (DWARF2) 来查看目标文件。当您使用 GCC 时,您可以使用 binutils 实用程序进行带注释的转储objdump -S。如果您转储所有部分,也会转储 DWARF 信息。

于 2010-06-02T17:09:38.153 回答