Я изучаю управление памятью и пытаюсь определить, что хранится во втором сегменте памяти только для чтения, специфичном для моей программы.
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 для компиляции моей тестовой программы.
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 документирует эти разделы.