【问题标题】:Addresses in gdb versus xxd dumpgdb 与 xxd 转储中的地址
【发布时间】:2015-09-14 18:10:39
【问题描述】:

我正在尝试在 xxd 转储中查找一行代码。如果我用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。

有没有办法将 gdb 地址转换为转储中的内容?或者有没有更好的方法让我在 xxd 转储中获取地址?

【问题讨论】:

  • 它是什么样的可执行文件?精灵,体育?
  • 这是一个 ELF 32 位可执行文件

标签: c++ gdb xxd


【解决方案1】:

我正在尝试在 xxd 转储中查找一行代码。

为了什么?你真正想达到什么目标?

很有可能,您可以使用 GDB 更轻松地实现这一目标。

如果我使用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。

您需要大量了解您的可执行文件。

运行此命令:readelf -l your_exe。这将向您显示可执行文件中有多个LOAD 段,并告诉您这些段在文件中的哪个偏移处开始,这些段应该出现在内存中的哪个虚拟地址,它们有多大,以及它们的保护措施应该有。

例如:

$ readelf -l a.out

Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 9 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x0056c 0x0056c R E 0x1000
  LOAD           0x000f08 0x08049f08 0x08049f08 0x00114 0x00118 RW  0x1000
  DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
  NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x000490 0x08048490 0x08048490 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R   0x1

这告诉您程序可执行文本(第一个LOAD 段)出现在内存中的地址0x08048000 和文件中的偏移量0。也就是说,xxd 将在文件中的偏移量0x124 处显示的指令将出现在内存中的地址0x08048124 处。

假设您的可执行文件链接到默认地址0x08048000的加载,内存中0x8212224处的指令将出现在xxd输出中的偏移量0x1ca224处。

【讨论】:

  • 正是我需要的和非常好的描述,谢谢!为了回答您关于我想要实现的目标的问题,我正在使用 xxd 将特定的代码行更改为无操作。
  • @Dtor "I was changed ... to no-ops" -- GDB 可以做到这一点而无需转换地址:stackoverflow.com/a/9426846/50617
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多