2015-10-15 10 views
11

Beim Betrachten eines bugfix im LLVM-Quellcode stieß ich auf den Begriff "virtueller Abschnitt" und fragte mich, was es bedeutete.Was ist ein virtueller LLVM-Abschnitt im Kontext von Objektdateien?

Ich habe versucht, ein paar verschiedene Begriffe zu googeln und den Quellcode weiter zu durchsuchen, aber alles, was ich gefunden habe, war, dass die Implementierungen für jedes Objekt Dateiformat isSectionVirtual Member-Funktion auszudrücken scheinen, dass ein Abschnitt ist virtuell, wenn es keinen Inhalt hat (B. ein .bss-Abschnitt, aber der Quellcode drückt klar aus, dass dies zwei verschiedene Konzepte sind). Die Implementierung variiert abhängig vom jeweiligen Objektformat.

Ich bin ziemlich neu zu verstehen, die Innereien von Objektdateien, so dass ich nicht sicher bin, ob dies eine LLVM-Sache oder ein allgemeineres Konzept außerhalb von LLVM ist.

Könnte mir bitte jemand sagen, was ein virtueller Bereich in einer Objektdatei ist?

Antwort

1

Laut den Kommentaren im LLVM-Quellcode ist der "virtuelle Abschnitt" ein Abschnitt, der keine Daten in der Objektdatei enthält. (Die PE/COFF-Spezifikation hat keinen solchen Begriff, daher wird sie wahrscheinlich nur in LLVM verwendet).

Der .bss Abschnitt hat nur nicht initialisierte Daten, also sollte es keine Daten in der Objektdatei haben (obwohl es theoretisch möglich ist). So ist der .bss Abschnitt sollte „virtuelle“ sein, und es besteht keine Notwendigkeit, den folgenden Code in LLVM haben:

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

Aber die Sache ist, dass LLVM nicht „virtuelle“ Abschnitte in Mach-O-Dateien unterstützt (oder vielleicht Mach-O-Dateien können sie nicht haben)

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

Daher LLVM getrennte Prüfungen für isBSS und isVirtual hat.

A BSS Abschnitt ist:

  • lesbare
  • beschreibbaren
  • nicht ausführbare
  • uninitialised Daten

Ein virtueller Abschnitt unterschiedliche Eigenschaften haben kann und Anwendungsfälle, wie beispielsweise schreibbar + ausführbar oder nicht lesbar (Ausrichtung) Abschnitte, die nicht BSS sind (beachten Sie, dass beschreibbare + ausführbare Abschnitte sind unsicher, und "Ausrichtung" Abschnitte sind nur für einige Code-Schutz (Anti-Dump) Tricks nützlich.

Jeder BSS-Abschnitt ist also ein virtueller Abschnitt, aber nicht jeder virtuelle Abschnitt ist ein BSS-Abschnitt.

+0

Sicherlich zeigen die separaten Überprüfungen, dass es sich tatsächlich um unterschiedliche Konzepte handelt? Sonst gäbe es nur "isBS" und "isVirtual" müsste nicht existieren. Danke für Ihre Eingabe! – OMGtechy

+0

@OMGtechy Ich aktualisierte die Antwort. – Abyx

+0

Danke, das ist viel besser! – OMGtechy