Salve, stavo leggendo la documentazione della microsft sul formato PE, e non mi torna il significato dell'ultimo paragrafo in "Section Data", il link alla sezione è questo, mentre questo è il paragrafo che non capisco:
Nel caso l'allineamento (virtuale) delle sezioni specificato nell'intestazione sia minore delle dimensioni di una pagina del sistema in uso, al file immagine viene applicata la seguente restrizione:
Per
Prendiamo il caso di un sistema le cui pagine sono grandi 0x1000 byte, ed un file immagine con:
Il file immagine avrà 2 sezioni chiamate
Ogni sezione ha
il loader dovrebbe allocare 2 pagine da 0x1000 byte, scrivere sulla prima pagina il contenuto della prima sezione
La restrizione di cui ho parlato prima dice che per tutte le sezioni il membro
Quindi, quale sarebbe la ragione dietro a questo vincolo?
Nel caso l'allineamento (virtuale) delle sezioni specificato nell'intestazione sia minore delle dimensioni di una pagina del sistema in uso, al file immagine viene applicata la seguente restrizione:
the location of section data in the file must match its location in memory when the image is loaded
location of section data in the file
presumo intenda il membro PointerToRawData
contenuto nell'intestazione che indica la posizione della sezione nel file sul disco, e questo valore deve combaciare con la posizione della sezione mappata in memoria, che corrisponde al membro VirtualAddress
nella medesima intestazione, però non mi torna il motivo di questa restrizione:Prendiamo il caso di un sistema le cui pagine sono grandi 0x1000 byte, ed un file immagine con:
Codice:
SectionAlignemnt = 0x500
FileAlignment = 0x200
.sec1
e .sec2
con:
Codice:
.sec1
PointerToRawData = 0x200
SizeOfRawData = 0x400
VirtualAddress = 0x1000
VirtualSize = 0x500
.sec2
PointerToRawData = 0x600
SizeOfRawData = 0x800
VirtualAddress = 0x1500
VirtualSize = 0x1000
PointerToRawData
diverso da VirtualAddress
eppure non capisco dove sia il problema nel mappare un file eseguibile del genere:il loader dovrebbe allocare 2 pagine da 0x1000 byte, scrivere sulla prima pagina il contenuto della prima sezione
.sec1
che avendo come dimensioni virtuali 0x500 byte lascerà altri 0x500 byte liberi, poi all'indirizzo virtuale 0x2000 verrà mappata la seconda sezione .sec2
, e non a 0x1500 come specificato dal membro VirtualAddress
, anche se non so se sia corretto mappare una sezione a un indirizzo virtuale che non sia il suo.La restrizione di cui ho parlato prima dice che per tutte le sezioni il membro
PointerToRawData
debba essere uguale a VirtualAddress
(se ho capito bene), il che implica anche che le dimensioni delle sezioni sul file ed una volta mappate sia lo stesso siccome una sezione con un VirtualSize > SizeOfRawData
sfaserebbe gli indirizzi delle sezioni a venire.Quindi, quale sarebbe la ragione dietro a questo vincolo?