gdb 与 xxd 转储中的地址

Addresses in gdb versus xxd dump

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

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

I'm trying to find a line of code in an xxd dump.

为了什么?您真正想要实现的目标是什么?

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

If I open the executable with gdb and add a breakpoint at the line of code, it shows an address like 0x8212224, but my xxd dump only goes as high as 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处的指令将出现在偏移量[=20处=] 在 xxd 输出中。