Scrittura di una sezione del compilatore - .reloc del COFF

5

Sto cercando un po 'di direzione nello scrivere un compilatore. Ho scritto in Common Intermediate Language , C# e vari altri linguaggi .NET; Ho scritto il mio Metadata Parser e ora sto cercando di capire i vari aspetti del layout Portable Executable ( PE ). Una cosa che mi disturba in qualche modo è la sezione .reloc .

Ho l'analisi di Relocs (o almeno penso di sì? :) e volevo sapere, all'interno delle librerie .NET di solito hanno un blocco Reloc singolo con un singolo HighLow ( IMAGE_REL_BASED_HIGHLOW , o solo 3 ) riposizionare a un determinato offset che cambia. Quando scrivo le mie sezioni PE Header e COFF, come posso calcolare Relative Virtual Address del blocco e Offset (inferiore a 12 bit) sulla voce TypeOffset che segue l'intestazione del blocco?

Attualmente sto usando il pecoff_v83.docx ( Eseguibile portatile di Microsoft e Common Object File Format Revisione 8.3 ) dal sito Web di Microsoft, ma penso che ci sia un passaggio che mi sto perdendo.

Collegherò un post pertinente: Come si accumulano le rilocazioni della base PE ?

^ Questo mi ha aiutato ad analizzare le voci di Reloc, ma analizzando e generando i dati che ci sono dentro sono domande diverse.

    
posta Alexander Morou 29.11.2015 - 20:11
fonte

1 risposta

0

... how do I calculate the Relative Virtual Address of the block, and the Offset (lower 12 bits) on the Type Offset entry that follows that block header?

Microsoft - Formato PE (30/05/2018):

"Base Relocation Block

Each base relocation block starts with the following structure:

Offset      Size      Field      Description


   0              4          RVA      The image base plus the page RVA is added to each offset to create the VA where the base relocation must be applied.

   4              4           BS         The total number of bytes in the base relocation
block, including the Page RVA and Block Size fields and the Type/Offset fields that follow.

 

The Block Size field is then followed by any number of Type or Offset field entries. Each entry is a WORD (2 bytes) and has the following structure:

Offset      Size      Field      Description


   0             4b        Type      Stored in the high 4 bits of the WORD, a value that indicates the type of base relocation to be applied. For more information, see Base Relocation Types.

   0            12b       Type      Stored in the remaining 12 bits of the WORD, an offset from the starting address that was specified in the Page RVA field for the block. This offset specifies where the base relocation is to be applied.

...

".

Il codice di esempio è in BinUtils .

Puoi trovare il codice di prova in binutils/ld/testsuite/ld-cygwin .

    
risposta data 23.09.2018 - 09:59
fonte

Leggi altre domande sui tag