• Nenhum resultado encontrado

Linguagem C. Produção de programas em C (Ligação estática) Centro de Cálculo Instituto Superior de Engenharia de Lisboa

N/A
N/A
Protected

Academic year: 2021

Share "Linguagem C. Produção de programas em C (Ligação estática) Centro de Cálculo Instituto Superior de Engenharia de Lisboa"

Copied!
10
0
0

Texto

(1)

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

(2)

Ficheiro objecto realocável (formato ELF)

bib: CSPP 7.{1-9} ELF header .text .rodata .data .bss .symtab .rel.text .rel.data .debug .line .strtab

Section 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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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)

(8)

Biblioteca estática

• Comando para gerar a biblioteca estática:

– ar crs libname.a fileobj1.o fileobj2.o fileobj3.o

– opções: c – create; r – sobrepõe módulos repetidos; s – cria tabela com

indexação para os módulos

• Motivação:

– reduzir a dimensão de um ficheiro objecto executável

– reduz, ligando apenas os módulos da biblioteca que efectivamente

resolvam algum símbolo indefinido

– A opção –static no Linker força a ligação estática de todos os módulos

(incluindo os módulos presentes na biblioteca libc.a)

(9)

Makefile (exemplo)

app: app.o libdynamic_mem.a

gcc -o app app.o ./libdynamic_mem.a

app.o: app.c dynamic_memory.h utils.h

gcc -Wall -pedantic -c -O2 app.c

libdynamic_mem.a: dynamic_memory.o utils.o heap.o

ar rcs libdynamic_mem.a dynamic_memory.o utils.o heap.o

dynamic_memory.o: dynamic_memory.c dynamic_memory.h heap.h macros.h

gcc -Wall -pedantic -c -O2 dynamic_memory.c

utils.o: utils.c utils.h heap.h dynamic_memory.h

gcc -Wall -pedantic -c -O2 utils.c

heap.o: heap.c heap.h

gcc -Wall -pedantic -c -O2 heap.c

Regra

Objectivo por

omissão

Requisitos

Comando:

Linha shell (zero ou mais)

Começa com o carácter ‘\t’ e não espaços

r – replace existing members

c – create archive

s – write object file index

> ar –t lib… , para ver a tabela

Objectivo

Make: Algoritmo recursivo que

executa os comandos para a regra

cujas dependências tenham uma

data posterior à data do objectivo

(10)

Makefile com variáveis automáticas (exemplo)

CFLAGS = -Wall –pedantic –g -c –O2

app: app.o libdynamic_mem.a

gcc -o $@ $< ./libdynamic_mem.a

app.o: app.c dynamic_memory.h utils.h

gcc $(CFLAGS) $<

libdynamic_mem.a: dynamic_memory.o utils.o heap.o

ar rcs $@ $^

dynamic_memory.o: dynamic_memory.c dynamic_memory.h heap.h macros.h

gcc $(CFLAGS) $<

utils.o: utils.c utils.h heap.h dynamic_memory.h

gcc $(CFLAGS) $<

heap.o: heap.c heap.h

gcc $(CFLAGS) $<

Variáveis automáticas:

$@ – nome do objectivo

$^ – requisitos (todos)

$< – primeiro requisito

$(…) – variável

Makefile

Referências

Documentos relacionados

Inspecção Visual Há inspeccionar não só os aspectos construtivos do colector como observar e controlar a comutação (em

Os principais resultados obtidos pelo modelo numérico foram que a implementação da metodologia baseada no risco (Cenário C) resultou numa descida média por disjuntor, de 38% no

One of the main strengths in this library is that the system designer has a great flexibility to specify the controller architecture that best fits the design goals, ranging from

A análise avançada é definida, no contexto da AS4100 (1990), como uma análise inelástica de segunda ordem muito precisa em que são incluídos os aspectos importantes (curvatura

O estudo Placebo-controlled Randomized study of the selective A 1 adenosine receptor antagonist rolofylline for patients hospitalized with acute heart failure and

Comparando com os resultados anteriores, principalmente com os obtidos com a amostra de Metal duro usinada em 0,50mm (TESTE 1), Figura 44, observa-se por uma análise visual que

Analisou-se o efeito de cinco substratos, constituídos de diferentes proporções de terra de subsolo, calcário e cinza de bagaço de cana, na altura, diâmetro de caule e peso fresco e

Os resultados obtidos indicaram que o Método do Ganho de Massa é viável para a obtenção do percentual de absorção de CO2; todas as mostras submetidas à cura por