Если я правильно понимаю, создав раздел .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
Других решений пока нет …