Какие данные хранятся во второй программе, предназначенной только для чтения сегмент памяти?

Я изучаю управление памятью и пытаюсь определить, что хранится во втором сегменте памяти только для чтения, специфичном для моей программы.

00400000-00401000 r-xp 00000000 00:28 144 /a.out
00600000-00601000 r--p 00000000 00:28 144 /a.out
00601000-00602000 rw-p 00001000 00:28 144 /a.out

Мне кажется, я определил сегмент нижнего диапазона как сегмент кода (или сегмент текста), где хранятся исполняемый код и постоянные глобальные переменные. Я также считаю, что третий сегмент с доступом для чтения / записи - это сегмент данных, в котором мы храним глобальные и статические переменные.

Мои исследования говорят мне, что существует сегмент под названием BSS, в котором хранятся неинициализированные переменные.Но второй сегмент памяти между адресом 00600000-00601000 показан как доступный только для чтения, наверняка там будут неинициализированные переменные (как их инициализировать?).

Моя теория заключалась в том, что мы храним здесь глобальные постоянные переменные, но исследования и эксперименты показали мне, что это не так, поскольку они хранятся в текстовом сегменте.

Я также читал о сегменте данных, доступном только для чтения (родата), который, насколько я понимаю, должен содержать статические постоянные данные. Это все? и почему здесь хранятся мои постоянные глобальные переменные?

Я использую gcc для компиляции моей тестовой программы.

0
29.01.2017, 22:02
1 ответ

r - p указывает сегмент, который доступен только для чтения и не является исполняемым. В типичном исполняемом файле ELF он содержит некоторую информацию о компоновщике. Вы можете запустить objdump -D a.out или readelf -a a.out , чтобы получить представление о том, что находится в этом сегменте. Например, readelf -a / bin / sleep на x86_64 в Debian Linux показывает следующие разделы в этом сегменте:

  [18] .init_array       INIT_ARRAY       0000000000606e10  00006e10
       0000000000000008  0000000000000000  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       0000000000606e18  00006e18
       0000000000000008  0000000000000000  WA       0     0     8
  [20] .jcr              PROGBITS         0000000000606e20  00006e20
       0000000000000008  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          0000000000606e28  00006e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000606ff8  00006ff8
       0000000000000008  0000000000000008  WA       0     0     8

LSB документирует эти разделы.

0
28.01.2020, 04:48

Теги

Похожие вопросы