2017-06-29 19 views
1

BSSセグメントの直後にヒープが始まるところを読んでいました。私は、次のコードでこれを確認しようとした私が(不正なメモリアクセスからの可能性が非常に高い)コアダンプを取得:実行からBSSセグメントとプログラムブレーク(ヒープエンド)の間の領域

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

extern char etext, edata, end; 

int main(int argc, char **arg, char **envp) { 
    printf("Size of virtual memory pages %ld\n", sysconf(_SC_PAGESIZE)); 

    printf("BSS segment ends at %p\n", &end); 
    printf("Program break (heap) ends at %p\n", sbrk(0)); 

    printf("Assuming segment above %p and below %p is heap\n", &end, sbrk(0)); 

    int *heap_ptr = (int *)sbrk(0); 
    //Subtract 40 bytes from heap end assuming heap is allocated 
    heap_ptr = heap_ptr - 10; 
    *heap_ptr = 21548; 

    printf("Reading value %d\n", *heap_ptr); 

    exit(EXIT_SUCCESS); 
} 

出力:

Size of virtual memory pages 4096 
BSS segment ends at 0x601060 
Program break (heap) ends at 0x8da000 
Assuming segment above 0x601060 and below 0x8da000 is heap 
Segmentation fault (core dumped) 

これは "があることを意味していますBSSの終わりからヒープの始まりまでの間に「穴」がありますか?あらかじめ割り当てられたヒープページはなく、BSSセグメントの終了直後に開始されないようです。

答えて

0

すべてこれはお使いのOSによって異なります。私はあなたがLinuxを走っていると仮定するつもりです。ほとんどのディストリビューションは、ヒープアドレスをランダム化するkernel.randomize_va_space = 2で出荷されます。

あなたは私が私のボックスでこれを実行した場合、私はあなたが間のギャップが明らかに存在であることがわかり

Size of virtual memory pages 4096 
BSS segment ends at 0x601080 
Program break (heap) ends at 0x1f37000 
Assuming segment above 0x601080 and below 0x1f37000 is heap 
00400000-00401000 r-xp 00000000 00:28 383781510    /home/guillaume/f 
00600000-00601000 r--p 00000000 00:28 383781510    /home/guillaume/f 
00601000-00602000 rw-p 00001000 00:28 383781510    /home/guillaume/f 
01f16000-01f37000 rw-p 00000000 00:00 0      [heap] 

を取得

FILE *fd = fopen("/proc/self/maps", "r"); 
if (fd) { 
    char line[256]; 
    while (fgets(line, sizeof(line), fd)) { 
     printf("%s", line); 
    } 
    fclose(fd); 
} 

を追加して、プログラム内のマッピングされたアドレスのリストを印刷することができます二。私はsudo sysctl kernel.randomize_va_space=0を実行する場合

しかし、その後、プログラムその場合

Size of virtual memory pages 4096 
BSS segment ends at 0x601080 
Program break (heap) ends at 0x623000 
Assuming segment above 0x601080 and below 0x623000 is heap 
00400000-00401000 r-xp 00000000 00:28 383781510     /home/guillaume/f 
00600000-00601000 r--p 00000000 00:28 383781510     /home/guillaume/f 
00601000-00602000 rw-p 00001000 00:28 383781510     /home/guillaume/f 
00602000-00623000 rw-p 00000000 00:00 0       [heap] 

を再実行して、そこにはギャップがなく、あなたのプログラムは、セグメンテーションフォールトしません。

0

メモリの基本的な誤解があります。まず、実行可能ファイルが完全にロードされた後に、複数のBSSセグメントが存在する可能性があります。第2に、複数のヒープが存在する可能性があります。あなたは、BSSセグメントの後にヒープを見つけるつもりはありません。

関連する問題