Linguagem C
Produção de programas em C
(Ligação estática)
João Pedro Patriarca ([email protected]) Centro de Cálculo
Instituto Superior de Engenharia de Lisboa
Capítulo 7, secções .1-.9
Capítulo 4, secções .5-.11
Ficheiro objecto realocável (formato ELF)
bib: CSPP 7.{1-9} ELF header .text .rodata .data .bss .symtab .rel.text .rel.data .debug .line .strtabSection header table secções
descreve secções
0
> objdump –h x.o , apresenta a header table das secções
> objdump –s -t x.o , apresenta o conteúdo das secções e os símbolos > objdump –j .rodata -s x.o , apresenta o conteúdo da secção indicada
> nm –n -S x.o , apresenta a tabela com os símbolos por ordem > objdump –d –M intel –S x.o , apresenta o disassembly das secções que contêm
Ligação estática (linker)
• Ligação estática de objectos realocáveis:
– Soluções, eventualmente, específicas do linker da GNU para problemas
comuns de qualquer linker
– Entrada: ficheiros objectos realocáveis; bibliotecas estáticas.
– 1ª fase – Resolução de símbolos: associa cada referência de símbolo
com uma única definição de símbolo
• Secção .symtab: tabela com os símbolos definidos e referenciados no
programa; não inclui apenas os símbolos mantidos no stack
nm filename.o, para apresentação da tabela com os símbolos
– 2ª fase – Realocação: junta e realoca as secções do mesmo tipo,
associa a cada definição de símbolo a sua localização em memória e
actualiza todas as referências para esses símbolos no programa (.text
e .data)
• Secções .rel.text e .rel.data: contém lista de localizações na secção
.text e .data, respectivamente, a actualizar pelo linker
– Saída: ficheiro objecto executável
ELF header
Segment header table
Ficheiro objecto executável (formato ELF)
bib: CSPP 7.{1-9} .init .text .rodata .data .bss .symtab .debug .line .strtab
Section header table descreve secções Mapeia secções a segmentos de memória segmento de memória read-only (code segment) segmento de memória read/write (data segment) secções não carregadas em memória 0
kernel virtual memory
Imagem em memória de um processo Linux
bib: CSPP 7.{1-9}
esp (stack pointer)
brk carregado do ficheiro executável 0 user stack (created at runtime)
memory mapped region for shared libraries
runtime heap (created at runtime by malloc) read/write segment (.data, .bss) read-only segment (.init,.text,.rodata) unused 0x08048000 0x40000000
0xc0000000 memória invisível ao código
Classificação de símbolos
• Símbolos fortes: funções e variáveis globais inicializadas
• Símbolos fracos: variáveis globais não inicializadas
• Definição múltipla de símbolos globais:
– Regra 1: não são permitidos múltiplos símbolos fortes;
– Regra 2: na presença de um símbolo forte e múltiplos símbolos fracos é
seleccionado o símbolo forte;
– Regra 3: na presença de múltiplos símbolos fracos é escolhido qualquer
um, tipicamente o que ocupará maior espaço em memória
Potenciais problemas no processo de ligação
• Cenário 1 – definições repetidas:
– As variáveis globais não inicializadas (símbolos fracos) têm um tratamento
diferente
– Os restantes símbolos são considerados fortes (var globais inicialidas,
funções globais)
– Erro de ligação na presença de repetições de símbolos fortes
• Cenário 2 – ausência da declaração de uma função externa:
– Na chamada à função passa como argumentos literais inteiros
– Na definição recebe doubles
– O erro manifesta-se apenas em tempo de execução
• Cenário 3 – definição múltipla de variáveis globais não inicializadas:
– Na tabela de símbolos apresentada pela ferramenta nm têm o atributo
COMMON (significa que ainda não têm espaço alocado em memória)
– Não dá erro de ligação, é criado um único símbolo e é alocado espaço que
dê suporte à definição que necessite de mais espaço em memória
• Na presença de um símbolo forte e múltiplos símbolos fracos ganha sempre o forte
• Exemplo com duas variáveis globais x e y do tipo inteiro, iniciadas e definidas no mesmo módulo A e uma variável x do tipo double, não iniciada, e definida no módulo B. No módulo B, uma função altera o double x; no main, chama-se a função e apresenta-se em notação hexadecimal os dois inteiros (CSPP pg 360)