Адресное пространство пространства раздела .bss в файле elf

Если я правильно понимаю, при создании раздела типа .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;

person The Mask    schedule 04.04.2014    source источник


Ответы (1)


Да, ОС заполнит раздел .bss нулями.

В общем, Linux (и другие версии Unix) в любом случае обнулят все «новые» страницы в процессе, чтобы избежать утечки контента от «предыдущего владельца» (подумайте об этом, как об уничтожении вашей переработки).

Редактировать:

В конечном счете, компоновщик и загрузчик отвечают за фактическое расположение раздела .bss. Как правило, он находится в конце раздела данных, как описано в спецификации ELF 1.2, рисунок 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

person Mats Petersson    schedule 04.04.2014
comment
Я так думаю, но я не совсем уверен, что вы пытаетесь сделать - хотя вы спрашивали, гарантированно ли выделяется память, равная нулю - я не смотрел так внимательно, как генерируются регионы, но выглядит разумный. - person Mats Petersson; 05.04.2014
comment
Я просто пытаюсь узнать, где начинается и заканчивается область раздела .bss. - person The Mask; 05.04.2014
comment
Не уверен, что вы имеете в виду... Где он находится, это комбинация компоновщика и загрузчика, который загружает файл в память. Ваш код выглядит нормально для расширения .bss на N байтов. - person Mats Petersson; 05.04.2014
comment
Извините, если я был недостаточно ясен. Предположим, что это статический исполняемый файл, а не динамический. Он имеет 2 раздела, а также фиксированные phdr и ehdr: .text и .bss. так что у меня есть в общей сложности 4 раздела. .bss является последним в файле elf и имеет sh_size = sizeof(int) * 2, что означает наличие места для двух статических переменных. То, что я ищу, это понять, где область этого сегмента (в данном случае sizeof(int) * 2) начинается и заканчивается, т. е. адрес памяти и его смещение. Это неясно, поэтому я предполагаю, что это от конца раздела смещения .bss в файле elf до размера, который я указал: sizeof(int) * 2). - person The Mask; 05.04.2014
comment
Как я уже сказал, это зависит от компоновщика, но обычно это будет сразу после сегмента .data (или предшествующего сегмента .bss, если их больше одного). Вы можете написать файл конфигурации компоновщика, который размещает .bss по адресу, далекому от .data. Просто обычно делается так, что .bss следует сразу после .data. (И все разделы .bss следуют друг за другом) - person Mats Petersson; 05.04.2014
comment
Измените свой ответ с этим комментарием на «Я принимаю». Кроме того, есть ли у вас хороший ресурс (также файл спецификации ELF), чтобы я лучше понял эти вещи, связанные с ELF? - person The Mask; 05.04.2014