Если я правильно понимаю, создав раздел типа .bss
(как .bss
ниже в примере кода), область записи/чтения секции .bss
будет от смещения секции в файле до N
и в этом случае phdr.p_memsz
будет увеличиваться на N
байтов и это до операционной системы/ядра нулевой области памяти. Правильно ли я говорю?
Elf32_Phdr phdr;
// ...
phdr.p_memsiz = somevalue;
Elf32_Shdr sec;
// ...
sec.sh_name = bss_name;
sec.sh_type = SHT_nobits;
sec.sh_flags = SHF_alloc + SHF_write;
sec.sh_size = N;
phdr.p_memsiz += N;
Да, ОС заполнит раздел.bss нулями.
В общем, Linux (и другие версии Unix) в любом случае обнулят все "новые" страницы в процессе, чтобы избежать утечки контента у "предыдущего владельца" (подумайте об этом, как об измельчении вашей утилизации).
Редактировать:
Улично, компоновщик и загрузчик отвечают за фактическое местоположение секции.bss. Как правило, он находится в конце раздела данных, как описано в спецификации 1.2 ELF, рис. 2.5.
Как описано в разделе "Разделы", раздел.bss имеет тип
SHT_NOBITS
. Хотя он не занимает места в файле, он вносит вклад в образ памяти сегмента. Обычно эти неинициализированные данные располагаются в конце сегмента, тем самым делаяp_memsz
больше, чемp_filesz
.
(В другом месте объясняется, что контент гарантированно равен нулю)
Здесь вы можете найти спецификацию (и многие другие места, но на этом сайте также есть некоторые полезные дополнительные документы и т.д.) Http://refspecs.linuxbase.org/
Исходный код LLVM и связанные с ним документы также достаточно читабельны (IMO): http://llvm.org/docs/doxygen/html/Support_2ELF_8h_source.html
Информация о том, как указать ссылку и порядок, расположение разделов: http://www.math.utah.edu/docs/info/ld_3.html