私は最近、低レベルのCSマテリアルを(再学習して)いて、バッファオーバーフローを調査しています。8バイト配列の基本的なCプログラムを作成しましたchar buffer[8];
。次に、GDBを使用してプログラムを調べて分解し、実行を進めました。私はUbuntuの64ビットバージョンを使用していますが、8バイトのchar配列が実際にはメモリ内の16バイトで表されていることに気付きました。上位ビットはすべて0です。
たとえば0xDEADBEEF 0x12345678
、8バイトの配列を表すと予想されるのではなく、実際にはのようなもの0x00000000 0xDEADBEEF 0x00000000 0x12345678
です。
私はグーグルを実行し、GCCにプログラムを32ビットプログラムとして(-m32
フラグを使用して)コンパイルさせることができました。これにより、通常どおり8バイトが期待されていました。
私は、8バイトの文字配列が64ビットシステムで16バイトで表される理由について明確な説明を探しています。最小ワードサイズ/アドレス指定可能な単位が16バイト(64ビット)であり、GDBが8バイトのワードサイズに基づいて単純に印刷しているためですか?
これが明確であることを願っていますが、説明が必要な場合はお知らせください。