Escrevendo uma seção Compiler - .reloc do COFF

5

Estou procurando um pouco de direção ao escrever um compilador. Eu escrevi em Common Intermediate Language , C# e várias outras linguagens .NET; Eu escrevi meu próprio Metadata Parser e agora estou tentando entender os vários aspectos do layout Executável Portátil ( PE ). Uma coisa que me confunde é a seção .reloc .

Eu tenho o Relocs parsing (ou pelo menos eu acho que eu faço :) e eu queria saber, dentro de bibliotecas .NET eles geralmente têm um único bloco Reloc com um único HighLow ( IMAGE_REL_BASED_HIGHLOW , ou apenas 3 ) Reloc em um determinado deslocamento que muda. Quando vou escrever minhas próprias seções de PE Header e COFF, como eu calculo o Relative Virtual Address do bloco, e o Offset (menor de 12 bits) na entrada TypeOffset que segue esse cabeçalho de bloco?

Atualmente estou usando o pecoff_v83.docx ( Microsoft Portable Executable e Common Object File Format Specification Revisão 8.3 ) do site da Microsoft, mas acho que há um passo que estou perdendo.

Vou vincular uma postagem relevante: Como as deslocalizações de base de PE se acumulam

^ Isso me ajudou a analisar as entradas Reloc, mas analisando elas e gerando os dados que entram nelas são questões diferentes.

    
por Alexander Morou 29.11.2015 / 20:11
fonte

1 resposta

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.

...

".

O código de exemplo está em BinUtils .

Você pode encontrar o código de teste em binutils/ld/testsuite/ld-cygwin .

    
por 23.09.2018 / 09:59
fonte