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