2015-10-15 4 views
11

В то же время, глядя на bugfix в исходном коде LLVM, я натолкнулся на термин «виртуальный раздел» и задался вопросом, что это значит.Что такое виртуальный раздел LLVM в контексте объектных файлов?

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

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

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

ответ

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.

+0

Несомненно, отдельные проверки показывают, что на самом деле это разные понятия? В противном случае просто 'isBSS' и' isVirtual' не будет существовать. Спасибо за ваш вклад! – OMGtechy

+0

@OMGtechy Я обновил ответ. – Abyx

+0

Спасибо, это намного лучше! – OMGtechy