gdb与xxd转储中的地址
Addresses in gdb versus xxd dump
我正试图在xxd转储中找到一行代码。如果我用gdb打开可执行文件,并在代码行添加断点,它会显示一个类似0x8212224的地址,但我的xxd转储仅高达0x304080。
有没有办法将gdb地址转换为转储中的地址?或者有更好的方法让我在xxd转储中获取地址吗?
我正试图在xxd转储中找到一行代码。
为什么?你真正想实现的是什么?
很有可能,使用GDB可以更容易地实现这一点。
如果我用gdb打开可执行文件,并在代码行添加断点,它会显示一个类似0x8212224的地址,但我的xxd转储仅高达0x304080。
您需要了解更多关于可执行文件的信息。
运行以下命令: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
处。
相关文章:
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 正在处理故障(堆芯转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 带"bad"的 windbg 核心转储分析地址
- 正在将c字符串的地址转储到ostream
- gdb与xxd转储中的地址
- 核心转储,<地址0x5bf6越界>