Мне было интересно узнать размер раздела по отношению к адресному пространству, которое этот раздел занимает.
Раздел обычно не занимает никакого адреса - сегмент делает.
ELF
обозначает исполняемый и связываемый формат и служит двойному назначению: (статическое) связывание и выполнение.
Во время фазы связывания компоновщик работает на секции и присваивает их 0 или более сегментам (но обычно не более 1 загружаемому сегменту).В некоторых разделах, таких как .note
или .comment
, обычно не установлен флаг SHF_ALLOC
, и они не заканчиваются на любом загружаемом сегменте.
Обратите внимание, что разделы не являютсянеобходим после статической ссылки и может быть полностью удален.
На этапе выполнения загружаемые сегменты mmap
помещаются в адресное пространство.Если раздел имел размер 100, имел флаг SHF_ALLOC
и был назначен какому-либо сегменту PT_LOAD
, то этот раздел будет занимать 100 байтов адресного пространства.
(я не предполагаю динамическийзагрузка или MMU здесь)
Динамическое связывание и MMU полностью ортогональны тому, что здесь происходит.Упоминая их, вы только мутите воду.
Например, скажем, размер раздела составляет 100 байт и начинается с адреса 0. Наивно я бы предположил, что адресное пространство, занятое этим разделом, будет изОт 0 до 100.
Как указывалось выше, ваш взгляд на мир не совсем точен, и раздел вряд ли будет фактически занимать диапазон адресов [0, 100)
.
Однако, если в адресах 0, 1, 2 и 3 есть символы, которые имеют размер 0, но имеют связанный с ними адрес, то фактическое адресное пространство будет 0-103 с 0-3 как пустое?
Символы - это просто метки , прикрепленные к определенным адресам.Они не занимают никакого адресного пространства сами.Они также могут быть полностью удалены после (статической) ссылки, хотя обычно их оставляют для упрощения отладки.Наличие этих символов / меток позволяет отладчику сообщать вам о сбое вашей программы, например, fscanf
, вызванный с foo
, вызванный с main
.