【问题标题】:I have questions about gdb memory address我对 gdb 内存地址有疑问
【发布时间】:2018-11-30 03:16:25
【问题描述】:

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

【问题讨论】:

  • 您面临的真正问题是什么?为什么你认为地址应该不同?
  • 不只是好奇
  • 为什么说“相反”?为什么你不认为地址应该是0xDEADBEEF
  • 不,我见过地址以 0x08 开头的示例,而我的地址是 0x56,我只是想知道为什么,就是这样。它只是一个问题。它不会妨碍我。

标签: c++ gcc gdb 32-bit


【解决方案1】:

我想知道是因为它的发行版不同还是我缺少一些 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二进制文件——它会说executable用于非PIE二进制文件,shared library用于PIE二进制文件。另见this answer

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多