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