Pesquisar este blog

Novidades no blog

- Passamos das 120k visitas \o/

- Os repositórios ainda precisam ser organizados!

- Nova postagem: Organizando a casa;
- LOS versão 0.7 (acesse, em breve, no github.com);

sábado, 5 de outubro de 2013

Considerações sobre o linker

Nesta postagem irei tratar de algumas considerações sobre o linker, informações prática, etc...


Sessões:

Um arquivo objeto é composto por sessões, cada uma com uma finalidade específica. As principais são:

TEXT :

É a sessão que possui o código executável do programa, normalmente a região da memória onde é carregada é configurada para somente leitura, de modo que não possa ser modificada.

DATA:

É a sessão que contem as variáveis estáticas inicializadas. Tem acesso de leitura e gravação.

RODATA:

É a sessão que, normalmente, contem as constantes. Tem acesso de somente leitura e normalmente é colocada junto (logo após) com a sessão TEXT.

BSS:

É a sessão que contem as variáveis estáticas não inicializadas. É uma sessão que sempre está vazia no arquivo objeto, onde somente há a informação do seu tamanho, pois ela somente é inicializada na memória.


Quando "linkamos" os arquivos-objeto, gerando uma imagem binária, a ordem e configurações das sessões são definidas pelo script de linkagem. As sessões são copiadas para a imagem na seguinte ordem (crescente), segundo o nosso script (LOS):

TEXT
RODATA
DATA
BSS

No ambiente de execução há também mais duas "sessões":

HEAP
STACK

A ordem do Heap e da Pilha depende de como o espaço de memória foi configurado.

Considerando que o Heap cresce para cima e a Pilha para baixo, a melhor forma de aproveitar todo o espaço da memória é a Pilha iniciando no topo da memória. Porem se a intenção é dividir a memória, talvez seja melhor definir um tamanho para a Pilha e colocá-la antes do Heap.

Quando o linker gera uma imagem binária, ele copia as sessões do arquivo objeto para esta imagem, porem a sessão BSS não existe fisicamente, pois são de dados não-inicializados, há somente metadados (informação de tamanho). Isto gera um arquivo menor que a imagem na memória.

Exitem outras sessões, estas normalmente não são copiadas para uma imagem binária. Porem qualquer sessão pode ser descartada utilizando a sessão '/DISCARD/' no arquivo de scritp, que fará com que qualquer sessão atribuída a ela seja explicitamente descarta.


Símbolos:

Os símbolos criados pelo linker, por um arquivo de script, são símbolo globais que podem ser acessados em qualquer lugar dentro do programa, tanto em Assembly quanto em Pascal.

Em Pascal basta definir um procedimento externo com o nome do símbolo, e para obter o endereço utiliza-se o operador '@' que retorna o endereço do símbolo. Pode-se também definir como sendo uma variável externa, mas em ambos os casos deve-se utilizar o operador '@', pois o que nos interessa é o endereço, não o que está no endereço.

Nenhum comentário:

Postar um comentário

Obs.: Após escrever seu comentário, inscreva-se por e-mail para seguir os próximos comentários. Ou assine a postagem de comentários (Atom).