2017-02-17 96 views
1

Открыв много исполняемых файлов (.exe., .msi) в Windows с помощью 7zip, я заметил много разных типов файлов, которые являются общими. К ним относятся .text, .data, .bss, .rdata, .pdata и т. Д. Я пытался получить информацию о них, но я не могу понять, что все они означают. Вот некоторые из них:Заголовки исполняемых разделов - значение и использование?

  • .text: Раздел кода содержит инструкции программы - только для чтения.
  • .data: Обычно используется для записи данных с некоторым инициализированным ненулевым содержимым. Таким образом, раздел данных содержит информацию, которая может быть изменена во время выполнения приложения, и этот раздел должен быть скопирован для каждого экземпляра.
  • .bss: Используется для записи статических данных, инициализированных до нуля.
  • .rdata: Здесь хранятся данные Const/Read-only.
  • .edata: каталог экспорта, дескрипторы & ручки
  • .idata: Импорт каталога для ручек & дескрипторов. Он используется исполняемыми файлами (exe, dll и т. Д.) Для назначения импортированных и экспортированных функций.
  • .rsrc: Секция, которая содержит информацию о различных других ресурсах, необходимых для исполняемого файла, например, значок, которое отображается при просмотре исполняемого файла в проводнике

Есть много других, которые являются общими, и я могу Не находите никакой информации. В основном это те: .pdata, .tls, .reloc, СЕРТИФИКАТ, .rsrc_1, .aspack, .adata, .INIT, DATA, CODE, .ctors.

Также в большинстве из них находится папка rsrc, которая содержит такие папки, как BITMAP, CURSOR, ICON, GROUP_CURSOR, GROUP_ICON, MENU, VERSION и другие.

Некоторые исполняемые файлы также содержат больше исполняемых файлов внутри, .html файлов, .txt файлов и т. Д. Я также открыл тот, который ничего не содержал (по крайней мере, ничего не показано, открыв его с помощью 7zip)! [Я открыл их все с помощью 7zip. ]


Вопросы

  1. Что эти разделы/сегменты я разместил делать? Есть ли сайт, на котором я могу найти их все?
  2. Все, на что я смотрел, это PE для Windows. Являются ли эти форматы стандартными и применяются к LINUX, UNIX и т. Д. Аналогичным образом?
  3. Почему некоторые исполняемые файлы содержат другие исполняемые файлы внутри, или .html, .txt и другие файлы? Как они обрабатываются при запуске исполняемого файла? Что они должны делать? AFAIK все внутри исполняемого файла должно иметь только те «сегменты», которые напоминают разделы кода сборки.
  4. Какая у вас польза от rsrc? Какие ресурсы он удерживает?

Я был бы признателен, если вы могли бы разместить больше информации/ссылки о том, почему все эти используются (как низкий уровень, как это возможно) и в целом, как исполняемый файл структура должна выглядеть, что она должна содержать и т.д.

Это примерно все.


EDIT

Я нашел другие имена заголовков общий раздел. Я буду публиковать их смысл здесь для полноты.

  • .reloc: Содержит таблицу перемещений.
  • .pdata: содержит массив записей таблицы функций для обработки исключений, и указуют на записи таблицы исключений в каталоге данных изображений
  • *data: пользовательские названий разделов данных
  • .init: Этот раздел содержит исполняемые инструкции, внести вклад в код инициализации процесса. То есть, когда программа начинает работать, система организует выполнение кода в этом разделе перед основной точкой ввода программы (называемой main в программах на C).
  • .fini: В этом разделе содержатся исполняемые инструкции, которые вносят вклад в код завершения процесса. То есть, когда программа завершается нормально, система организует выполнение кода в этом разделе.
  • .ctors: Раздел, который сохраняет список конструкторов
  • .dtors: Раздел, который содержит список деструкторов

ответ

3

Названия разделов не имеют отношения к формату файла. Инструментальная цепочка (обычно линкер) может выбирать все, что ему нравится. Операционная система не использует имена для поиска разделов, о которых она заботится, она использует data directory в заголовке файла. Который содержит числа, а не имена. Название просто служит мнемоникой, помогающей идентифицировать разделы.Или может использоваться, чтобы помочь языковой среде выполнения или отладчику найти разделы назад, которые не охвачены каталогом данных.

Согласование в названиях разделов, в основном по договоренности. Название раздела weirdo, такое как BSS, полностью возвращается к 50-м годам, используемым в Fortran, акрониму для Block Started by Symbol. Не помогает догадываться о его использовании сегодня :) И вы можете предположить, что раздел с именем CODE будет содержать исполняемый код и эквивалентен .text, гораздо более часто используемому имени. Имена типа .tls и .reloc могут быть сопоставлены с соответствующей записью каталога данных без особых проблем.

Тот же прием для .rsrc, отображается в третьей записи в каталоге данных. Для OS это важна функция winapi, такая как LoadString.

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

Загрузитель операционной системы размещает раздел непосредственно в виртуальной памяти через файл с отображением памяти, который использует исполняемый файл в качестве хранилища резервных копий. Как используются разделы типа .text, .data и .bss, обратите внимание на то, как они не имеют соответствующей записи в каталоге данных. Линкер позаботился о создании правильных адресов, как это было сделано еще 25 лет назад, без необходимости в ОС. Кроме раздела .reloc, если файл не может быть сопоставлен с его предпочтительным базовым адресом, он является старым.

+0

Очень просветительский ответ сэр. Эта ссылка - это то, что я хотел и предоставляю всю информацию. Я также нашел множество других имен заголовков общих разделов, и я опубликую их все выше, чтобы отличить, где в каталоге данных они соответствуют. Еще один вопрос о «toolchain», о котором говорили вы и old_timer. Я знаю, что это такое, но что именно вы имеете в виду? AFAIK используется в процессе построения, компоновщик не задействован при запуске исполняемого файла, а только загрузчик, который загружает его в ОЗУ. Можете ли вы подробнее рассказать о «инструментальной цепочке»? Большое спасибо. –

+0

Вы используете инструментальную цепочку для создания программы. По крайней мере, компилятор и компоновщик, возможно, дополнительные инструменты, такие как компилятор ресурсов. Некоторые языки объединяют все эти инструменты в один исполняемый файл, все идет. Ввод - исходный код, вывод - исполняемый файл. –

+0

Хорошо. Так вот что я знал. –

2

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

Операционная система должна знать только пару вещей. Насколько этот файл является фактически загружаемыми данными и где я его загружаю. операционная система не знает/видит .text из .data, он видит загружаемые блоки. Он копирует эти блоки из файла в память, тогда он видит определенную точку входа, она переходит к этой точке входа. Остальная часть информации - это ... информация ... для отладчика - это программное обеспечение или человек, заинтересованный в том, сколько или компилятор размещен в разделе .data, например.

прямо или косвенно, чтобы программист правильно использовал эти разделы, как правило, программист не участвует напрямую. Программное обеспечение, называемое начальной загрузкой, выполняет работу с этими разделами по мере необходимости. Например, bootstrap обычно нули раздел .bss, решение для системного проектирования в toolchain компилятора, сообщает загрузочному блоку, как большой и начальный адрес .bss и нулевые бутстрап-нули.

.data и .text обычно просто загружаются операционной системой и не нуждаются в дополнительном внимании, поскольку это загружается в RAM. Но, например, если это микроконтроллер, нам нужно иметь ненулевые глобальные .data в энергонезависимой памяти (flash/rom), но когда мы запускаем и скомпилируем наш скомпилированный код, нам это нужно в ram. Таким образом, bootstrap обычно выполняет эту работу по копированию.данные от flash до ram с использованием решения для проектирования системы компилятора для указания начальной загрузки начального адреса во flash и начального адреса в ram и сколько копировать.

Системные схемы, о которых я говорю, являются переменными, если вы хотите, чтобы язык ассемблера (в противном случае это проблема с курицей и яйцом), использует загрузчик, который заполняется компоновщиком после того, как компоновщик выполнил свою работу и понял сколько есть всего и где они помещаются в двоичный или образ памяти.

Данные - это данные, вы можете вставлять данные в свой двоичный текст, будь то текст или html или изображения (jpg, bmp, png и т. Д.) Или другие, правый инструмент hexdump может показать, что в используемой toolchain может быть даже специальный раздел имена для этих данных.

Практически все эти названия разделов отчасти отлаживают выход компилятора и частично информативны. У конкретной инструментальной цепочки есть свои имена определенных секций, которые она использует, или, возможно, даже позволяет пользователю (программисту) создавать свои собственные произвольные имена, поскольку это все, что они есть. И эта конкретная toolchain использует эту информацию как часть своего дизайна системы, компилятор сортирует программу из данных, и ей не нужно, но исторически сортировать ненулевые глобальные данные из предполагаемого нуля при запуске глобальных данных. И, возможно, глубже, чем чтение только ненулевых данных. Он маркирует эти объекты с именами, чтобы компоновщик мог собирать все именованные капли, а с помощью сценария компоновщика выполнять свою задачу по сборке этих блоков в больших блоках и назначать им адреса. А затем исправление двоичного кода при необходимости для разрешения внешних адресов/переменных.

Вопрос 1: Нет ни одного сайта, где вы можете найти их все, вполне возможно, если не легко продемонстрировать, что хотя бы одна инструментальная цепочка позволяет пользователю изобретать свое собственное название раздела, как таковое невозможно один или несколько веб-сайтов, чтобы охватить все возможные названия разделов и определения тех названий разделов, которые может возникнуть у какого-то программиста.

Вопрос 2: Существует общий набор .text, .data, .bss, который был в значительной степени принят и используется большинством, если не все инструментальные цепочки во всех целевых системах (windows, unix и т. Д.), Это функция инструментальная цепочка не является операционной системой, так как операционная система не знает или не заботится. Он просто загружает загружаемые капли и ветви в точку входа. Поскольку эти имена произвольны и должны работать только внутри системного дизайна инструментальной цепочки, не имеет смысла спрашивать об операционных системах.

Вопрос 3: ВСЕ разделы, странные или нет, управляются либо косвенно с помощью инструментальной цепочки, либо связаны в библиотеках или непосредственно программистом. От .bss до .somethingimadeup.

Вопрос 4: Звучит операционная система. понять, что операционная система определяет, какие поддерживаемые исполняемые форматы и в чем состоят. Компилятор должен соответствовать этому, чтобы сделать рабочие двоичные файлы. Например, операционная система, такая как Windows, может очень сильно любить иметь битовый образ значка в «двоичном», чтобы он мог показать, что на рабочем столе рядом с именем программы, которое также является информацией в двоичном формате. Поэтому в дополнение к очевидным вещам, которые должен иметь формат двоичного файла (смещение в файл и размер и адрес назначения в памяти для загружаемых капель данных и точки ввода исполнения), формат файла может иметь другие информационные или другие элементы. Формат файла для «ярлыка Windows» может быть подмножеством или специальным «двоичным» форматом. Вся информация - это путь и имя файла для другого файла, а не код, который вы действительно загружаете и запускаете. или ярлык, например, у вас может быть «двоичный» формат файла, содержащий URL-адрес. Но это будет очень сильно зависит от операционной системы и зависит от нее.

 Смежные вопросы

  • Нет связанных вопросов^_^