C++’ta Read-Only Belleğe Yazmak ve Kodun Gerçek Yolculuğu
Yayınlanma: 16 Aralık 2025
Okuma Süresi: ~1 dakika
C++’ta Read-Only Belleğe Yazmak ve Kodun Gerçek Yolculuğu
Gündüz iş yerinde yazdığım her C++ satırında aklım ister istemez işlemcinin içinde o satırın hangi adrese dokunduğunu, bellekte nasıl bir iz bıraktığını simüle ediyor.
Ama işin temposu içinde bunu derinleştirmeyi erteliyorum.
Gece olduğunda ise zihnimde aynı sorular yeniden beliriyor:
Bu fonksiyon neden tam burada döndü?
Bu veri belleğin hangi segmentine yerleşti?
İşletim sistemi bu davranışı neden engelledi?
Bazen saat kaç olduğunu bile fark etmiyorum.
Ama son dönemde zihnimi en çok meşgul eden konu şu:
Read-only belleğe yazma girişimi ve bunun arkasındaki sistem mimarisi.
İşletim Sistemi Neden Buna İzin Vermez?
C++’ta şu kod çok klasik bir tuzaktır:
const char* p = "Evren";
strcpy(const_cast<char*>(p), "Otur");
Yüzeyde sıradan görünür.
Ama "Evren" gibi literal’lar program belleğinde read-only bir bölgeye, yani .rodata segmentine yerleştirilir.
Bu bölge korumalıdır, çünkü:
Sabit veriler değişmemelidir
Kod güvenliği bozulmamalıdır
Bellek yanlış erişimlere karşı korunmalıdır
Sistem kararlılığı sağlanmalıdır
strcpy() ise doğası gereği hedef bellek alanına yazmak zorundadır.
Sonuç:
Segmentation fault, undefined behavior, protected memory violation.
Bu çökme bir hata değil; işletim sisteminin “buraya dokunamazsın” demesidir.
Bu Bölge Gerçekte Nedir?
C++ programı belleğe yüklendiğinde mimari aşağıdaki gibi segmentlere ayrılır:
.text → Programın çalıştırılabilir makine kodu
.rodata → Sabit veriler ve string literal’ların bulunduğu read-only alan
.data / .bss → Global ve static değişkenler
stack / heap → Çalışma zamanı için ayrılmış, yazılabilir alanlar
String literal tam olarak .rodata içindedir.
Bu bölge işletim sistemi tarafından yazmaya kapatılmıştır.
strcpy() ise sadece yazılabilir hedeflerde güvenle çalışır.
İşte bu iki gerçek çarpıştığında uygulama durur.