Calcolatori Elettronici Assemblatore, Linker e Loader

16
Assembler, Linker & Loader 1 Calcolatori Calcolatori Elettronici Elettronici Assemblatore, Linker e Assemblatore, Linker e Loader Loader Francesco Lo Presti Francesco Lo Presti rielaborate da rielaborate da Salvatore Tucci Salvatore Tucci

description

Calcolatori Elettronici Assemblatore, Linker e Loader. Francesco Lo Presti rielaborate da Salvatore Tucci. Compilazione. Nella prima fase, il programma ad alto livello viene tradotto nel linguaggio assembler utilizzando un apposito programma detto compilatore - PowerPoint PPT Presentation

Transcript of Calcolatori Elettronici Assemblatore, Linker e Loader

Page 1: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 1

Calcolatori ElettroniciCalcolatori Elettronici

Assemblatore, Linker e Assemblatore, Linker e LoaderLoader

Francesco Lo PrestiFrancesco Lo Presti

rielaborate darielaborate da

Salvatore TucciSalvatore Tucci

Page 2: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 2

CompilazioneCompilazione

Nella prima fase, il programma ad alto livello viene Nella prima fase, il programma ad alto livello viene tradotto nel linguaggio assembler utilizzando un tradotto nel linguaggio assembler utilizzando un apposito programma detto apposito programma detto compilatorecompilatore

Dopo la fase di compilazione, il programma scritto il Dopo la fase di compilazione, il programma scritto il linguaggio assembler viene tradotto in linguaggio linguaggio assembler viene tradotto in linguaggio macchina utilizzando un apposito programma detto macchina utilizzando un apposito programma detto assemblatoreassemblatore (assembler) (assembler)

Spesso con il termine compilazione si indica l’intero Spesso con il termine compilazione si indica l’intero processo di traduzione da linguaggio ad alto livello a processo di traduzione da linguaggio ad alto livello a linguaggio macchina (essendo l’assemblatore spesso linguaggio macchina (essendo l’assemblatore spesso integrato con il compilatore)integrato con il compilatore)

Page 3: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 3

Il processo di compilazioneIl processo di compilazione

Il programma sorgente è Il programma sorgente è scritto in un linguaggio scritto in un linguaggio ad alto livello (ad es., C)ad alto livello (ad es., C)

Il codice oggetto, scritto Il codice oggetto, scritto in linguaggio macchina, in linguaggio macchina, viene memorizzato su viene memorizzato su discodisco

Il caricatore (Il caricatore (loaderloader) ) carica il programma in carica il programma in memoria principale per memoria principale per l’esecuzionel’esecuzione

Programma sorgente

Programma in linguaggio assembler

hello.c

compilatore

hello.s

Programma in linguaggio macchina

(codice oggetto)hello.out

assemblatore

caricatore

Programma in memoria

Page 4: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 4

Il linkerIl linker

Il Il linkerlinker (link editor o collegatore) ha il compito di collegare (link editor o collegatore) ha il compito di collegare tra loro vari moduli che compongono lo stesso programmatra loro vari moduli che compongono lo stesso programma Programma sorgente suddiviso in più file che vengono Programma sorgente suddiviso in più file che vengono

compilati separatamente creando diversi file oggettocompilati separatamente creando diversi file oggetto Utilizzo di funzioni di libreriaUtilizzo di funzioni di libreria

Il linker collega tra loro i file contenenti il codice oggetto Il linker collega tra loro i file contenenti il codice oggetto dei vari moduli che costituiscono il programma, unendovi dei vari moduli che costituiscono il programma, unendovi anche il codice delle funzioni di libreria utilizzate, anche il codice delle funzioni di libreria utilizzate, producendo un file contenente il codice eseguibile, producendo un file contenente il codice eseguibile, memorizzato su disco memorizzato su disco

Page 5: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 5

EsempioEsempio.globl main

main:...

jal proc

...

.globl proc

proc: addi $sp, $sp, -20

...

beq $s0, $zero, ret

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal proc

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal is_in

beq $v0, $zero, else2

sll $s3, $s3, 1

addi $s3, $s3, 1

j ret

else2: addi $s3, $s3, 2

ret: addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

.globl is_in

is_in: addi $t0, $zero, 0

addi $t1, $zero, 0

while: slt $t2, $t0, $a2

beq $t2, $zero, end

sll $t3, $t0, 2

add $t3, $a1, $t3

lw $t4, 0($t3)

bne $t4, $a0, inc

addi $t1, $zero, 1

j end

inc: addi $t0, $t0, 1

j while

end: addi $v0, $t1, 0

jr $ra

Page 6: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 6

L’assemblatoreL’assemblatore

Traduce un modulo in assembler in un file oggettoTraduce un modulo in assembler in un file oggetto Una combinazione diUna combinazione di

Istruzioni in linguaggio macchinaIstruzioni in linguaggio macchina Dati Dati Informazioni per la corretta collocazione del modulo in memoria: Informazioni per la corretta collocazione del modulo in memoria:

RilocazioneRilocazione EsempioEsempio

Per poter tradurre in linguaggio macchina le istruzioni di salto, Per poter tradurre in linguaggio macchina le istruzioni di salto, l’assemblatore deve poter determinare gli indirizzi l’assemblatore deve poter determinare gli indirizzi corrispondenti alle etichette usate nei salti (corrispondenti alle etichette usate nei salti (tabella dei simbolitabella dei simboli))

Tabella dei simboliTabella dei simboli: contiene le corrispondenze tra nomi delle : contiene le corrispondenze tra nomi delle etichette (simboli) ed indirizzi di memoriaetichette (simboli) ed indirizzi di memoria

Il file oggetto prodotto dall’assemblatore assume che il Il file oggetto prodotto dall’assemblatore assume che il modulo parta dalla locazione di memoria 0 (indirizzi modulo parta dalla locazione di memoria 0 (indirizzi relativi)relativi) Sarà il linker a gestire la rilocazioneSarà il linker a gestire la rilocazione

Istruzioni dipendenti da un indirizzo assolutoIstruzioni dipendenti da un indirizzo assoluto

Page 7: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 7

Il processo di assemblaggioIl processo di assemblaggio

Il processo di traduzione in linguaggio macchina è Il processo di traduzione in linguaggio macchina è semplice, salvo per le istruzioni con riferimenti a etichette semplice, salvo per le istruzioni con riferimenti a etichette locali non ancora dichiarate (locali non ancora dichiarate (riferimenti in avantiriferimenti in avanti: : l’etichetta è usata prima di essere definita) l’etichetta è usata prima di essere definita)

Assemblatore a due passateAssemblatore a due passate Prima passataPrima passata: calcola la lunghezza delle istruzioni e genera : calcola la lunghezza delle istruzioni e genera

una tabella dei simboli, contenente l’associazione tra i nomi una tabella dei simboli, contenente l’associazione tra i nomi delle etichette ed i corrispondenti indirizzi di memoriadelle etichette ed i corrispondenti indirizzi di memoria

Seconda passataSeconda passata: tutti i riferimenti locali sono noti: usando la : tutti i riferimenti locali sono noti: usando la tabella dei simboli, può generare il codice macchinatabella dei simboli, può generare il codice macchina

Assemblatore ad una passataAssemblatore ad una passata Traduce in codice binario tutte le istruzioni tranne quelle con Traduce in codice binario tutte le istruzioni tranne quelle con

riferimenti in avanti (tecnica del riferimenti in avanti (tecnica del backpatchingbackpatching)) Mette queste istruzioni in una tabella dei simboli irrisoltiMette queste istruzioni in una tabella dei simboli irrisolti Alla fine traduce anche questeAlla fine traduce anche queste Maggiore velocità ma intera rappresentazione binaria in Maggiore velocità ma intera rappresentazione binaria in

memoriamemoria

Page 8: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 8

Struttura del file oggettoStruttura del file oggetto

Nei sistemi Unix, il file oggetto è composto da 6 sezioni distinteNei sistemi Unix, il file oggetto è composto da 6 sezioni distinte Object file header (intestazione)Object file header (intestazione)

Dimensione e posizione delle altre parti del file oggettoDimensione e posizione delle altre parti del file oggetto Segmento di testoSegmento di testo

Codice in linguaggio macchina per le procedure nel file sorgente; Codice in linguaggio macchina per le procedure nel file sorgente; possono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a possono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a simboli esterni)simboli esterni)

Segmento di datiSegmento di dati Rappresentazione binaria dei datiRappresentazione binaria dei dati

Informazioni di rilocazioneInformazioni di rilocazione Identificazione di istruzioni e dati da aggiornare al momento della Identificazione di istruzioni e dati da aggiornare al momento della

rilocazione, in quanto dipendenti da indirizzi di memoria assolutirilocazione, in quanto dipendenti da indirizzi di memoria assoluti Tabella dei simboliTabella dei simboli

Simboli definiti nel modulo e Simboli definiti nel modulo e riferibili dall’esternoriferibili dall’esterno (etichette globali) e (etichette globali) e lista dei lista dei riferimenti irrisoltiriferimenti irrisolti (ad es. per uso di funzioni di libreria) (ad es. per uso di funzioni di libreria)

Informazioni per il debuggerInformazioni per il debugger Descrizione concisa del modo in cui il programma è stato compilatoDescrizione concisa del modo in cui il programma è stato compilato

Page 9: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 9

Esempio: Primo Passata Esempio: Primo Passata

EtichettaEtichetta IndirizzoIndirizzo

procproc 0x000x00

else2else2 0x600x60

retret 0x640x64

.globl proc

proc: addi $sp, $sp, -20

...

beq $s0, $zero, ret

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal proc

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal is_in

beq $v0, $zero, else2

sll $s3, $s3, 1

addi $s3, $s3, 1

j ret

else2: addi $s3, $s3, 2

ret: addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

Tabella dei Simboli

Page 10: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 10

Esempio: Secondo PassataEsempio: Secondo Passata.globl proc

proc: addi $sp, $sp, -20

...

beq $s0, $zero, ret

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal proc

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal is_in

beq $v0, $zero, else2

sll $s3, $s3, 1

addi $s3, $s3, 1

j ret

else2: addi $s3, $s3, 2

ret: addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

addi $sp, $sp, -20

...

beq $s0, $zero, 14

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal 0x0

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal ???

beq $v0, $zero, 3

sll $s3, $s3, 1

addi $s3, $s3, 1

j 0x64

addi $s3, $s3, 2

addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

Generazione

Codice

Macchina

EtichettaEtichettaIndirizzoIndirizzo

procproc 0x000x00

else2else2 0x600x60

retret 0x640x64

Tabella dei Simboli

EtichettaEtichettaIndirizzoIndirizzo

procproc 0x000x00

is_inis_in 0x4B0x4B

Tabella dei Simboli

Istr.Istr.IndirizzoIndirizzo

jaljal 0x380x38

jaljal 0x4B0x4B

jj 0x5B0x5B

Relocation Information

Page 11: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 11

Il linkerIl linker

Ciascun modulo ha il suo spazio degli indirizziCiascun modulo ha il suo spazio degli indirizzi Quando i moduli vengono collegati occorre Quando i moduli vengono collegati occorre traslaretraslare i loro spazi i loro spazi

degli indirizzidegli indirizzi Occorre risolvere tutti i riferimenti esterni – tramite etichetteOccorre risolvere tutti i riferimenti esterni – tramite etichette

globali - globali - ossia le chiamate tra moduli e riferimenti a variabili ossia le chiamate tra moduli e riferimenti a variabili globaliglobali

Compiti del linker (a partire dalla tabella dei simboli e dalle Compiti del linker (a partire dalla tabella dei simboli e dalle informazioni di rilocazione)informazioni di rilocazione) Porre simbolicamente in memoria istruzioni e datiPorre simbolicamente in memoria istruzioni e dati Determinare gli indirizzi dei dati e delle etichette dei saltiDeterminare gli indirizzi dei dati e delle etichette dei salti Unire i riferimenti interni ed esterni alle procedureUnire i riferimenti interni ed esterni alle procedure

Il linker produce un file oggetto che può essere eseguito Il linker produce un file oggetto che può essere eseguito sulla macchinasulla macchina Stesso formato del file oggetto ma con tutti i riferimenti risolti e Stesso formato del file oggetto ma con tutti i riferimenti risolti e

senza informazioni di rilocazionesenza informazioni di rilocazione

Page 12: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 12

EsempioEsempio...

jal ???

...

addi $t0, $zero, 0

addi $t1, $zero, 0

slt $t2, $t0, $a2

beq $t2, $zero, 8

sll $t3, $t0, 2

add $t3, $a1, $t3

lw $t4, 0($t3)

bne $t4, $a0, 2

addi $t1, $zero, 1

j 0x30

addi $t0, $t0, 1

j 0x08

addi $v0, $t1, 0

jr $ra

addi $sp, $sp, -20

...

beq $s0, $zero, 14

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal 0x00

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal ???

beq $v0, $zero, 3

sll $s3, $s3, 1

addi $s3, $s3, 1

j 0x64

addi $s3, $s3, 2

addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

0x400000

0x4000AC

0x4000B0

0x400120

0x400124

0x400158

Page 13: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 13

EsempioEsempio...

jal 0x4000B0

...

addi $t0, $zero, 0

addi $t1, $zero, 0

slt $t2, $t0, $a2

beq $t2, $zero, 8

sll $t3, $t0, 2

add $t3, $a1, $t3

lw $t4, 0($t3)

bne $t4, $a0, 2

addi $t1, $zero, 1

j 0x400154

addi $t0, $t0, 1

j 0x40012B

addi $v0, $t1, 0

jr $ra

addi $sp, $sp, -20

...

beq $s0, $zero, 14

addi $a0, $s0, -1

addi $a1, $s1, 0

addi $a2, $s2, 0

jal 0x4000B0

addi $s3, $v0, 0

addi $a0, $s0, 0

addi $a1, $s1, 0

addi $a2, $s2, 0

jal 0x400124

beq $v0, $zero, 3

sll $s3, $s3, 1

addi $s3, $s3, 1

j 0x400104

addi $s3, $s3, 2

addi $v0, $s3, 0

...

addi $sp, $sp, 20

jr $ra

0x400000

0x4000AC

0x4000B0

0x400120

0x400124

0x400158

Page 14: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 14

Istruzioni MIPS da RilocareIstruzioni MIPS da Rilocare

Indirizzi relativi al PC (istruzioni beq e bne): da Indirizzi relativi al PC (istruzioni beq e bne): da non rilocarenon rilocare L’indirizzamento relativo al PC è preservato anche se L’indirizzamento relativo al PC è preservato anche se

il codice viene spostatoil codice viene spostato

Indirizzi assoluti (istruzioni j e jal): da rilocare Indirizzi assoluti (istruzioni j e jal): da rilocare sempresempre

Da rilocare anche istruzioni lw e sw che Da rilocare anche istruzioni lw e sw che utilizzano il registro $gp per indirizzare dati utilizzano il registro $gp per indirizzare dati staticistatici

Riferimenti esterni (tipicamente istruzione jal): Riferimenti esterni (tipicamente istruzione jal): da rilocare sempreda rilocare sempre

Page 15: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 15

Il loaderIl loader

Una volta che il linker ha creato il file eseguibile, Una volta che il linker ha creato il file eseguibile, esso viene di solito memorizzato su discoesso viene di solito memorizzato su disco

All’atto dell’esecuzione, il S.O. lo carica dal disco All’atto dell’esecuzione, il S.O. lo carica dal disco e ne avvia l’esecuzionee ne avvia l’esecuzione

Il loader si occupa di far partire il programmaIl loader si occupa di far partire il programma Legge l’intestazione per determinare la dimensione dei Legge l’intestazione per determinare la dimensione dei

segmenti testo e datisegmenti testo e dati Crea uno spazio di memoria sufficiente per testo e datiCrea uno spazio di memoria sufficiente per testo e dati Copia istruzioni e dati in memoriaCopia istruzioni e dati in memoria Copia nello stack i parametri (se presenti) passati al Copia nello stack i parametri (se presenti) passati al

main main Inizializza i registri e lo stack pointerInizializza i registri e lo stack pointer Salta ad una procedura di inizializzazione che copia i Salta ad una procedura di inizializzazione che copia i

parametri nei registri appositi dallo stack e poi invoca la parametri nei registri appositi dallo stack e poi invoca la procedura di inizio del programma (main() in C)procedura di inizio del programma (main() in C)

Page 16: Calcolatori Elettronici Assemblatore, Linker e Loader

Assembler, Linker & Loader 16

Librerie collegate dinamicamenteLibrerie collegate dinamicamente

Svantaggi del collegamento statico (prima Svantaggi del collegamento statico (prima dell’esecuzione del programma)dell’esecuzione del programma) Le routine della libreria fanno parte del codice Le routine della libreria fanno parte del codice

eseguibileeseguibile Uso di vecchie versioni della libreria anche se Uso di vecchie versioni della libreria anche se

disponibili nuove versionidisponibili nuove versioni Caricamento dell’intera libreria anche se usata Caricamento dell’intera libreria anche se usata

parzialmenteparzialmente

Librerie collegate dinamicamente (DLL)Librerie collegate dinamicamente (DLL) Le routine della libreria non sono collegate e caricate Le routine della libreria non sono collegate e caricate

finché il programma non viene eseguito finché il programma non viene eseguito Ogni routine viene collegata solo dopo essere Ogni routine viene collegata solo dopo essere

invocata (invocata (lazy procedure linkagelazy procedure linkage) )