2013-12-22 9 views
0

Тест на 32 битном LinuxПочему я могу видеть несколько одинаковых сегментов в выходе/proc/pid/maps?

код выглядит следующим образом:

int foo(int a, int b) 
{ 
    int c = a + b; 
    return c; 
} 

int main() 
{ 
    int e = 0; 
    int d = foo(1, 2); 
    printf("%d\n", d); 
    scanf("%d", &e); 

    return 0; 
} 

и когда я использую кота/Proc/PID/карты, чтобы увидеть расположение в памяти, кажется, что я вижу три текст сегмент для моего кода и библиотеки.

ubuntu% cat /proc/2191/maps 
08048000-08049000 r-xp 00000000 08:01 1467306 /home/shuai/work/asm/test1 
08049000-0804a000 r--p 00000000 08:01 1467306 /home/shuai/work/asm/test1 
0804a000-0804b000 rw-p 00001000 08:01 1467306 /home/shuai/work/asm/test1 
09137000-09158000 rw-p 00000000 00:00 0   [heap] 
b75c6000-b75c7000 rw-p 00000000 00:00 0 
b75c7000-b776b000 r-xp 00000000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so 
b776b000-b776d000 r--p 001a4000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so 
b776d000-b776e000 rw-p 001a6000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so 
b776e000-b7771000 rw-p 00000000 00:00 0 
b7780000-b7784000 rw-p 00000000 00:00 0 
b7784000-b7785000 r-xp 00000000 00:00 0   [vdso] 
b7785000-b77a5000 r-xp 00000000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so 
b77a5000-b77a6000 r--p 0001f000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so 
b77a6000-b77a7000 rw-p 00020000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so 
bfd47000-bfd68000 rw-p 00000000 00:00 0   [stack] 

Может ли кто-нибудь дать мне руководство по этой проблеме? Большое спасибо!

ответ

2

Учитывайте значения в столбцах 3 (начальное смещение) и 2 (разрешения). На самом деле у вас есть одна и та же часть, дважды отображаемая в строках 1 и 2 для вашего двоичного файла, но в строке 3 она отличается. Разрешается сопоставлять один и тот же файл отдельно несколько раз; разные системы могут пропускать объединение в одну запись карты VM, поэтому она может отражать историю сопоставления, но не текущую переменную состояния.

Если вы видите на библиотеки отображений можно легко найти закон, что любая библиотека сопоставляется отдельно:

  • С разрешения прочитать и выполнить: основной код, который не должен быть изменен.
  • С разрешением для чтения: постоянная область данных без разрешенного кода.
  • С разрешения на чтение и запись: он объединяет не постоянную область данных и таблицы перемещения общих объектов.

Наличие одинаковой стартовой двоичной области 4K двоичного файла, отображаемой дважды, может быть объяснено логикой RTLD, которая отличается от произвольной логики библиотеки из-за потребностей начальной загрузки. Я не отношусь к этому так важно, тем более, что он может легко различаться по специфике платформы.

2

Обратите внимание, что три секции для каждого файла имеют разные разрешения: только для чтения, чтение-запись и чтение-выполнение. Это для безопасности: раздел кода (read-execute) не может быть написан с помощью эксплойтов, и сегмент, который может быть записан, не может быть выполнен.