私はOSの教科書を読んでいますが、システムが仮想アドレスをサポートしているかどうかを確認し、次のプログラムが毎回同じ結果を出力する必要があると言う例があります。私は私のMacBookプロのいくつかの違いを参照してください。アドレスのランダム化:cで静的なvarのプリントアドレス
#include <stdio.h>
int var = 0;
int main(void)
{
var += 1;
printf("Address: %x, value: %d\n", &var, var);
return 0;
}
実行したときに、それは私が(すべてではないそれらのが)いくつかのバイトのアドレスの変更を参照してください。
./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1
私はGDBで実行すると、私は常に1018を参照してください。
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19631) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19636) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19654) exited normally]
これをGDBで直接実行するとどう違うのですか?なぜそれを直接実行するとアドレスが変わるのが分かりますか?
本が古くなって、それが(HTTPS [アドレス空間レイアウトのランダム化]について考えていませんでした私たちが定期的に出力を期待する場合オフをオンにする必要があり.wikipedia.org/wiki/Address_space_layout_randomization)。 – unwind
ASLRについて言及しているので、私のシステムは静的変数の場所をランダム化します。 – user2018791
ASLRが実装されているレベルでは、OSはマッピングを作成しているメモリの特定のページに何が入っているのか正確には気にしません。 「静的変数」は、基本的に「書き込み可能なメモリ内のもの」です。 – unwind