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.
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 é:
Tamanho | Descrição |
---|---|
16 bytes | MD5 fingerprint ou message-digest do restante do arquivo |
4 bytes | EM04 - Assinatura de identificação (Executable Module 0.4) |
4 bytes | Tamanho da pilha das linhas de execução |
4 bytes | Início do código do módulo |
4 bytes | Tamanho do código do módulo |
4 bytes | Início dos dados somente leitura do módulo |
4 bytes | Tamanho dos dados somente leitura do módulo |
4 bytes | Início dos dados do módulo |
4 bytes | Tamanho dos dados do módulo |
4 bytes | Tamanho dos dados não iniciados |
4 bytes | Início da seção das funções utilizadas |
4 bytes | Tamanho da seção das funções utilizadas |
4 bytes | Início da seção de relocação das funções utilizadas |
4 bytes | Tamanho da seção de relocação das funções utilizadas |
4 bytes | Início da seção com as strings do arquivo |
2 bytes | Tamanho 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.
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.
Esta seção contém informações sobre as funções utilizadas pelo módulo.
Cada entrada tem o seguinte formato:
Tamanho | Descrição |
---|---|
2 bytes | Índice para o nome da interface |
2 bytes | Índice para o nome da implementação |
3 bytes | número da função |
1 byte | propriedades 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:
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:
Tamanho | Descrição |
---|---|
4 bytes | Deslocamento dentro do código onde a função é chamada |
1 byte | Propriedades da relocação |
3 bytes | Índice para a função utilizada |
As propriedades podem ser:
Tamanho | Posição | Descrição |
---|---|---|
1 bit | bit 0 | 1 - 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.