ELF: использование размера раздела для расчета диапазона адресов - PullRequest
0 голосов
/ 06 декабря 2018

Мне было интересно узнать размер раздела по отношению к адресному пространству, которое этот раздел занимает.(Я не предполагаю динамическую загрузку или MMU здесь)

Включает ли размер раздела 0 символов размера, если они есть?

Например, скажем, размер раздела составляет 100 байт и начинается с адреса0. Наивно, я бы предположил, что адресное пространство, занимаемое этим разделом, будет от 0 до 100.

Предполагая, однако, что есть символы там по адресу 0, 1, 2 и 3, которые имеют размер 0, ноесли с ними связан адрес, то фактическое адресное пространство будет 0-103, а 0-3 пустым?

Есть ли такие символы?Я новичок в формате ELF и не уверен на 100%, как это будет работать.

1 Ответ

0 голосов
/ 09 декабря 2018

Мне было интересно узнать размер раздела по отношению к адресному пространству, которое этот раздел занимает.

Раздел обычно не занимает никакого адреса - сегмент делает.

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.

...