2015-10-15 10 views
11

Mentre guardavo uno bugfix nel codice sorgente LLVM, mi sono imbattuto nel termine "sezione virtuale" e mi chiedevo cosa volesse dire.Che cos'è una sezione virtuale LLVM nel contesto dei file oggetto?

Ho provato a cercare su Google un paio di termini diversi e ad esplorare ulteriormente il codice sorgente, ma tutto ciò che sono riuscito a trovare è che le implementazioni per ogni funzione membro del formato file isSectionVirtual sembrano esprimere che una sezione è virtuale se non ha contenuto (come una sezione .bss, ma il codice sorgente esprime chiaramente che si tratta di due concetti diversi). L'implementazione varia a seconda del formato oggetto specifico coinvolto.

Sono abbastanza nuovo per comprendere l'interno dei file oggetto, quindi non sono sicuro che questa sia una cosa LLVM o un concetto più generale presente al di fuori di LLVM.

Qualcuno potrebbe dirmi che cos'è una sezione virtuale in un file oggetto?

risposta

1

In base ai commenti nel codice sorgente LLVM, la "sezione virtuale" è una sezione che non ha alcun dato nel file oggetto. (Le specifiche PE/COFF non hanno questo termine, quindi è probabilmente usato solo in LLVM).

La sezione .bss ha solo dati non inizializzati, quindi non dovrebbe avere alcun dato nel file oggetto (anche se teoricamente può). Così la sezione .bss dovrebbe essere "virtuale", e non c'è bisogno di avere il seguente codice nel LLVM:

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

Ma la cosa è che LLVM non supporta le sezioni "virtuali" nei file Mach-O (o forse i file Mach-o non possono averli)

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

Quindi LLVM ha controlli separati per isBSS e isVirtual.

sezione

A BSS è:

  • leggibili
  • scrivibili
  • non eseguibili
  • dati inizializzate

Una sezione virtuale può avere diverse proprietà e utilizzare casi, come ad esempio sezioni scrivibili + eseguibili o non leggibili (allineamento) che non sono BSS (si noti che le sezioni scrivibili + eseguibili sono insicure e le sezioni di "allineamento" sono utili solo per alcuni trucchi di protezione del codice (anti-dump)).

Quindi ogni sezione BSS è una sezione virtuale, ma non ogni sezione virtuale è una sezione BSS.

+0

Sicuramente i controlli separati indicano che si tratta in realtà di concetti diversi? Altrimenti, ci sarebbe semplicemente 'isBSS' e' isVirtual' non avrebbe bisogno di esistere. Grazie per il tuo contributo a prescindere! – OMGtechy

+0

@OMGtechy Ho aggiornato la risposta. – Abyx

+0

Grazie, è molto meglio! – OMGtechy