我对 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
。另见 .
当我使用 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
。另见