में एक स्थिर 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]
तो इसे सीधे और जीडीबी में चलाने में क्या अलग है? मुझे यह क्यों दिखाई देता है कि यह पता चलता है कि जब यह सीधे चलाता है?
किताब पुरानी हो चुकी है, इसके बारे में [पता अंतरिक्ष लेआउट randomization] (https नहीं सोचा था .wikipedia.org/wiki/Address_space_layout_randomization)। – unwind
यह एएसएलआर का उल्लेख करता है, इसलिए मेरा सिस्टम स्थैतिक चर के स्थानों को भी यादृच्छिक करता है? – user2018791
उस स्तर पर जहां एएसएलआर लागू किया गया है, मुझे नहीं लगता कि ओएस वास्तव में स्मृति के विशेष पृष्ठ में क्या चल रहा है, यह मैपिंग बना रहा है। मूल रूप से "स्थिर चर" केवल "लिखने योग्य स्मृति में कुछ" है। – unwind