Arquivo de módulo executável

Esta página descreve o formato do arquivo de módulo executável versão 0.4

O arquivo de módulo executável, ao contrário do arquivo de módulo do sistema, não precisa ter informações sobre as funções existentes, pois essas funções nunca são utilizadas por outros módulos. Por isso, o formato é bem simples

O arquivo é dividido nas seguintes seções: cabeçalho, strings utilizadas, funções utilizadas e relocação das funções utilizadas.

Cabeçalho

O cabeçalho do arquivo fica no início e tem informações sobre o tamanho e a posição de cada uma das seções, além de informações globais do módulo. O seu formato é:

TamanhoDescrição
16 bytesMD5 fingerprint ou message-digest do restante do arquivo
4 bytesEM04 - Assinatura de identificação (Executable Module 0.4)
4 bytesTamanho da pilha das linhas de execução
4 bytesInício do código do módulo
4 bytesTamanho do código do módulo
4 bytesInício dos dados somente leitura do módulo
4 bytesTamanho dos dados somente leitura do módulo
4 bytesInício dos dados do módulo
4 bytesTamanho dos dados do módulo
4 bytesTamanho dos dados não iniciados
4 bytesInício da seção das funções utilizadas
4 bytesTamanho da seção das funções utilizadas
4 bytesInício da seção de relocação das funções utilizadas
4 bytesTamanho da seção de relocação das funções utilizadas
4 bytesInício da seção com as strings do arquivo
2 bytesTamanho da seção com as strings do arquivo
2 bytesÍndice para o comentário

Se o tamanho de uma seção for 0 ela não existe. Assim, se a seção com os dados somente leitura tiver tamanho 0, quer dizer que não existem dados somente leitura no módulo.

O campo MD5 fingerprint é usado para validar o restante do arquivo. Isso garante que o arquivo não está corrompido.

O campo tamanho da pilha é usado para especificar o tamanho da pilha em bytes das linhas de execução criadas para executar este módulo. O tamanho tem que ser uma potência de 2, ou seja, 12 para 4096 bytes, 14 para 16384 bytes, etc e se for zero é usado o tamanho padrão.

Dados não iniciados têm o seu conteúdo iniciado com zero.

Strings do arquivo

Esta seção contém todas as strings utilizadas nas seções do arquivo de módulo. As strings terminam com o byte 0. É o mesmo tipo de string usado na linguagem C/C++.

A primeira string é a string vazia, ou seja, o primeiro byte desta seção é o byte zero.

As strings não podem se repetir nesta seção. Elas devem ser únicas.

Funções utilizadas

Esta seção contém informações sobre as funções utilizadas pelo módulo.

Cada entrada tem o seguinte formato:

TamanhoDescrição
2 bytesÍndice para o nome da interface
2 bytesÍndice para o nome da implementação
3 bytesnúmero da função
1 bytepropriedades da função

O nome da interface e da implementação podem ter no máximo 32 caracteres cada incluindo o zero final.

O campo propriedades da função pode ser:

Relocação das funções utilizadas

Esta seção contém informações sobre a localização e o tipo de relocação que deve ser feita para a chamada de funções das interfaces.

Esta seção deve estar ordenada pelo deslocamento de forma crescente.

Cada entrada desta seção tem o seguinte formato:

TamanhoDescrição
4 bytesDeslocamento dentro do código onde a função é chamada
1 bytePropriedades da relocação
3 bytesÍndice para a função utilizada

As propriedades podem ser:

TamanhoPosiçãoDescrição
1 bitbit 01 - relocação absoluta; 0 - relocação relativa

Na relocação absoluta, o endereço na memória do início da função utilizada é colocado no deslocamento a ser mudado.

Já na relocação relativa, o endereço na memória do início da função utilizada é subtraído do endereço de memória onde a relocação está sendo feita. Ou seja, é uma chamada relativa ao endereço da instrução que chamou.