我最近一直在(重新学习)较低级别的 CS 材料,并且一直在探索缓冲区溢出。我创建了一个具有 8 字节数组的基本 C 程序char buffer[8];
。然后我使用 GDB 探索和反汇编程序并逐步执行。我在 64 位版本的 Ubuntu 上,我注意到我的 8 字节字符数组实际上在内存中以 16 字节表示 - 高位都只是 0。
例如,0xDEADBEEF 0x12345678
与我可能期望的那样表示 8 字节数组不同,它实际上类似于0x00000000 0xDEADBEEF 0x00000000 0x12345678
.
我做了一些谷歌搜索,并能够让 GCC 将我的程序编译为 32 位程序(使用-m32
标志) - 这导致预期的 8 个字节正常。
我只是在寻找关于为什么 8 字节字符数组在 64 位系统上以 16 字节表示的明确解释。是因为最小字长/可寻址单元是 16 字节(64 位),而 GDB 只是基于 8 字节字长打印?
希望这很清楚,但如果需要澄清,请告诉我。