Ich lese ein OS-Lehrbuch, gibt es ein Beispiel die überprüfen, ob das System virtuelle Adressen unterstützt und sagt das folgende Programm sollte das gleiche Ergebnis jedes Mal drucken. Ich sehe einen Unterschied auf meinem Macbook Pro.Adresse Randomisierung: Druckadresse einer statischen Var in c
#include <stdio.h>
int var = 0;
int main(void)
{
var += 1;
printf("Address: %x, value: %d\n", &var, var);
return 0;
}
, wenn es ausgeführt sehe ich die Adressänderungen in einigen Bytes (nicht alle von ihnen jedoch):
./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1
Als ich in GDB laufen, sehe ich 1018 immer:
(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]
Also was ist der Unterschied darin, es direkt und in GDB zu betreiben? Warum sehe ich die Adresse variiert, wenn sie direkt ausgeführt wird?
Das Buch ist veraltet, es hat nicht darüber nachdenken, [Address Space Layout Randomisierung] (https: // en .wikipedia.org/wiki/Address_space_layout_randomization). – unwind
Es erwähnt ASLR, also mein System sogar die Standorte von statischen Variablen zufällig? – user2018791
Auf der Ebene, auf der ASLR implementiert ist, glaube ich nicht, dass das OS genau darauf achtet, was in die bestimmte Seite des Speichers hineingeht, für die es ein Mapping erstellt. Eine "statische Variable" ist im Grunde nur "etwas im Schreibspeicher". – unwind