компоновщик: что такое раздел «NMAGI C» в связанном файле и какова цель выравнивания раздела? - PullRequest
0 голосов
/ 12 марта 2020

ld man здесь скажем

-n --nmagic Отключить выравнивание страниц по разделам и пометить вывод как «NMAGI C», если это возможно. -N --omagic Установить текст и разделы данных для чтения и записи. Кроме того, не выравнивайте сегмент данных по страницам и не отключайте связывание с общими библиотеками. Если выходной формат поддерживает числа Unix style magi c, пометьте вывод как «OMAGI C». Примечание. Несмотря на то, что для целей PE-COFF разрешен раздел с возможностью записи текста, он не соответствует спецификации формата, опубликованной Microsoft. --no-omagic Этот параметр отменяет большинство эффектов параметра -N. Он устанавливает текстовый раздел только для чтения и принудительно выравнивает сегмент данных. Примечание. Этот параметр не позволяет создавать ссылки на общие библиотеки. Для этого используйте -Bdynami c.

Я понимаю, что эти варианты используются для того, чтобы сделать раздел кода (.text) доступным для записи или нет, но я не вижу смысла выравнивать или не разделы, а что такое «NMAGI C» раздел

1 Ответ

3 голосов
/ 21 апреля 2020

В архиве c (PDP-11) Unix заголовок исполняемого файла начинался с инструкции ветвления, которая перепрыгивала бы через заголовок к фактическому началу кода. Когда Unix был перенесен на другие процессоры, эта начальная инструкция ветвления PDP-11 стала окаменелой как «число magi c» для формата файла a.out (5). Когда был введен «чистый текст», первоначально для того, чтобы процессы могли совместно использовать свои сегменты кода, было введено новое число magi c, чтобы ядро ​​могло отличить его (были некоторые важные Unix программы, которые полагались на самоизменение код и, следовательно, должны быть загружены с сегментами кода для записи). Старое число волхвов c (0407) получило название «ОМАГИ C» - «старые волхвы c» - а новому числу волхвов c (0410) было дано имя «НМАГИ * 1016». * "," новые волхвы c ". Сегмент данных следует непосредственно за сегментом кода в памяти, поэтому, когда сегмент кода становится доступным только для чтения, он должен быть дополнен до границы страницы.

Различные операционные системы и форматы файлов с тех пор представили другие маги c цифры; в последних выпусках FreeBSD для использования формата a.out обычными форматами были ZMAGI C и QMAGI C, которые были введены для того, чтобы позволить нулевой странице в адресном пространстве быть отображенной для безопасности (чтобы разыменование нулевого указателя) будет ошибкой), в то же время позволяя выполнять вызовы исполняемых файлов по требованию (т. е. mmap () вписывается в адресное пространство процесса).

Поэтому, чтобы ответить на ваш вопрос более прямо: NMAGI C и OMAGI C различны форматы исполняемых файлов, а не отдельных разделов. Они указывают желаемое соответствие между расположениями в памяти и на диске исполняемого файла. (Причина, по которой эти числа традиционно записываются в восьмеричном, а не шестнадцатеричном или десятичном виде, заключается в том, что восьмеричное является естественным представлением формата инструкций на PDP-11.) GNU ld использует эти имена (только) в качестве ссылок на исполняемые форматы, имеющие аналогичные функции даже если вы не генерируете традиционный формат a.out - что, конечно, сегодня встречается довольно редко. Одно особое преимущество использования формата OMAGI C заключается в том, что он более компактен, чем любой другой формат, что может иметь значение в таких случаях, как загрузчики, когда пространство ограничено, нет разбиения на страницы по требованию, а также нет места для любого вида обивка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...