Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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.