Calcolatori Elettronici Assemblatore, Linker e Loader
-
Upload
ulric-padilla -
Category
Documents
-
view
26 -
download
0
description
Transcript of 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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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)
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) )