我对gdb内存地址有疑问

时间:2018-06-20 21:46:04

标签: c++ gcc gdb 32-bit

当我使用gcc将C ++程序编译为32位并通过gdb运行它时。当我反汇编主要功能时,gdb读取内存地址,例如:0x585583d0,而在其他人的32位示例中,它则读取0x080483d0。我正在使用Kali linux,想知道是否只是因为它的发行版不同,还是我缺少一些C库?

1 个答案:

答案 0 :(得分:2)

  

我想知道是否只是因为它的发行版不同,还是我缺少一些C库?

这是因为您构建了position independent executable,而其他人却没有。

在32位x86系统上,非PIE二进制文件的默认加载地址为0x08048000。 GDB下PIE二进制文件的默认加载地址在0x5855....区域中(在GDB之外,它可能是非常随机的;如果您set disable-randomization off,您会发现可执行文件开始“跳转”到不同的地址)。

一些较新的发行版默认会构建PIE二进制文件。您可以通过以下方式避免这种情况:

gcc -no-pie main.c

现在生成的二进制文件应以0x08048xxx开头。

您可以使用file a.out检查是否有PIE二进制文件-非PIE二进制文件将显示executable,而PIE二进制文件将显示shared library。另请参见this answer