我对 gdb 内存地址有疑问

I have questions about gdb memory address

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

am wondering if its just because its a different distribution or am I missing some C libraries?

这是因为你建了一个position independent executable,而其他人没有。

32 位 x86 系统上非 PIE 二进制文件的默认加载地址是 0x08048000。 GDB 下 PIE 二进制文件的默认加载地址在 0x5855.... 区域中的某处(在 GDB 之外它可以是非常随机的;如果你 set disable-randomization off,你会观察到可执行文件开始 "jumping around"到不同的地址)。

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

gcc -no-pie main.c

生成的二进制文件现在应该在 0x08048xxx 左右开始。

您可以使用 file a.out 检查您是否拥有 PIE 二进制文件——对于非 PIE 二进制文件,它将显示 executable,对于 PIE 二进制文件,将显示 shared library。另见 .