Что такое виртуальный раздел LLVM в контексте объектных файлов?

Просматривая исправление в исходном коде LLVM, я наткнулся на термин , "виртуальный раздел" и поинтересовался, что это значит.

Я попытался поискать в Google несколько разных терминов и просмотреть исходный код, но все, что мне удалось найти, это то, что реализации для каждой функции-члена формата объектного файла isSectionVirtual, по-видимому, выражают, что раздел является виртуальным, если он не имеет содержимого (например, файл . bss, но в исходном коде ясно сказано, что это два разных понятия). Реализация варьируется в зависимости от конкретного задействованного формата объекта.

Я довольно новичок в понимании внутренностей объектных файлов, поэтому я не уверен, является ли это вещью LLVM или более общей концепцией, присутствующей вне LLVM.

Может кто-нибудь сказать мне, что такое виртуальный раздел в объектном файле?


person OMGtechy    schedule 15.10.2015    source источник


Ответы (1)


Согласно комментариям в исходном коде LLVM, «виртуальный раздел» — это раздел, который не имеет данных в объектном файле. (В спецификации PE/COFF такого термина нет, поэтому он, вероятно, используется только в LLVM).

Раздел .bss содержит только неинициализированные данные, поэтому в объектном файле не должно быть никаких данных (хотя теоретически может). Так что секция .bss должна быть "виртуальной", и в LLVM нет необходимости иметь следующий код:

if (Sec.isBSS() || Sec.isVirtual())

Но дело в том, что LLVM не поддерживает "виртуальные" разделы в файлах Mach-O (или, может быть, файлы Mach-O не могут их иметь)

bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
  // FIXME: Unimplemented.
  return false;
}

Следовательно, LLVM имеет отдельные проверки для isBSS и isVirtual.

Раздел BSS:

  • удобочитаемый
  • записываемый
  • неисполняемый
  • неинициализированные данные

Виртуальный раздел может иметь разные свойства и варианты использования, такие как доступные для записи + исполняемые или нечитаемые (выравнивание) разделы, которые не являются BSS (обратите внимание, что доступные для записи + исполняемые разделы небезопасны, а разделы «выравнивания» полезны только для некоторого кода). защитные (антидамповые) приемы).

Таким образом, каждый раздел BSS является виртуальным разделом, но не каждый виртуальный раздел является разделом BSS.

person Abyx    schedule 30.10.2015
comment
Неужели отдельные проверки указывают на то, что это на самом деле разные понятия? В противном случае было бы просто isBSS, а isVirtual не нужно было бы существовать. Спасибо за ваш вклад, несмотря ни на что! - person OMGtechy; 30.10.2015
comment
Спасибо, так намного лучше! - person OMGtechy; 30.10.2015