Раздел против сегмента? - PullRequest
0 голосов
/ 04 мая 2020

Я уже прочитал этот пост, и я понимаю, что сегменты содержат информацию времени выполнения и инкапсулируют разделы, которые содержат информацию о ссылках. Но я все еще не понимаю, почему эти термины используются в этих двух книгах взаимозаменяемо.

«Руководство по кодировщику оболочки»

Далее информация загружается из исполняемого файла программы. на вновь созданное адресное пространство. Существует три типа сегментов: .text, .bss и .data. Сегмент .text отображается только для чтения, тогда как .data и .bss доступны для записи. Сегменты .bss и .data зарезервированы для глобальных переменных. Сегмент .data содержит инициализированные данные c, а сегмент .bss содержит неинициализированные данные. Последний сегмент, .text, содержит инструкции программы.

«Профессиональный язык ассемблера»

Текстовый раздел необходим во всех программах на ассемблере. Это где коды команд объявляются в исполняемой программе. Разделы data и bss являются необязательными, но часто используются в программе. Раздел данных объявляет элементы данных, которые объявлены с начальным значением. Эти элементы данных используются в качестве переменных в программе на языке ассемблера. В разделе bss объявляются элементы данных, которые создаются с нулевым (или нулевым) значением. Эти элементы данных чаще всего используются в качестве буферных областей в программе на языке ассемблера.

1 Ответ

2 голосов
/ 04 мая 2020

В контексте ELF это две разные связанные вещи.

  • Сегменты описаны в заголовке программы. Обычно каждый сегмент описывает часть файла, который будет загружен в память при запуске исполняемого файла.

  • Разделы описаны в заголовке раздела. В общих чертах, каждый раздел описывает кусок данных, относящихся к программе.

Таким образом, и разделы, и сегменты являются фрагментами файла, описанными как смещение и размер (хотя в обоих случаях размер может быть 0, в этом случае смещение игнорируется). Любой данный файл ELF может иметь только сегменты, или только разделы, или сегменты и разделы. Чтобы быть исполняемым, он должен иметь сегменты для загрузки. Чтобы быть связанными, он должен иметь разделы, описывающие, что и где. Таким образом, исполняемый файл, связанный с dynmaically, всегда будет иметь оба значения.

В общем случае сегменты не перекрывают друг друга, а разделы не перекрывают друг друга, но разделы могут описывать данные, являющиеся частью (или всеми) сегмента. Это не является строгим требованием к формату, но было бы странно нарушать. Также было бы очень странно для раздела описывать данные в двух разных сегментах. Есть также (как правило) разделы, которые не являются частью какого-либо сегмента.

...