Assemblatore Linker Loadert
description
Transcript of Assemblatore Linker Loadert
-
Assembler, Linker & Loader 1
ArchitettureArchitetture deidei CalcolatoriCalcolatori((LettereLettere AA--I)I)
AssemblatoreAssemblatore, Linker e Loader, Linker e Loader
Prof. Francesco Lo PrestiProf. Francesco Lo Presti
Assembler, Linker & Loader 2
CompilazioneCompilazione
Nella prima fase, il programma ad alto livello viene tradotto Nella prima fase, il programma ad alto livello viene tradotto nel linguaggio assembler utilizzando un apposito programma nel linguaggio assembler utilizzando un apposito programma detto 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 macchina linguaggio assembler viene tradotto in linguaggio macchina utilizzando un apposito programma detto utilizzando un apposito programma detto assemblatoreassemblatore(assembler)(assembler)
Spesso con il termine compilazione si indica lSpesso con il termine compilazione si indica lintero processo intero processo di traduzione da linguaggio ad alto livello a linguaggio di traduzione da linguaggio ad alto livello a linguaggio macchina (essendo lmacchina (essendo lassemblatore spesso integrato con il assemblatore spesso integrato con il compilatore)compilatore)
Assembler, Linker & Loader 3
Il processo di compilazioneIl processo di compilazione
Il programma sorgente Il programma sorgente scritto in un linguaggio ad scritto in un linguaggio ad alto livello (ad es., C)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 llesecuzioneesecuzione
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 Il linkerlinker
Il Il linkerlinker ((linklink editor o editor o collegatorecollegatore) ha il compito di collegare tra ) ha il compito di collegare tra loro vari moduli che compongono lo stesso programmaloro vari moduli che compongono lo stesso programma Programma sorgente suddiviso in piProgramma sorgente suddiviso in pi file che vengono compilati file che vengono compilati
separatamente creando diversi file oggettoseparatamente creando diversi file oggetto Utilizzo di funzioni di libreriaUtilizzo di funzioni di libreria
Il Il linkerlinker collega tra loro i file contenenti il codice oggetto dei collega tra loro i file contenenti il codice oggetto dei vari moduli che costituiscono il programma, unendovi anche il vari moduli che costituiscono il programma, unendovi anche il codice delle funzioni di libreria utilizzate, producendo un filecodice delle funzioni di libreria utilizzate, producendo un filecontenente il codice eseguibile, memorizzato su disco contenente il codice eseguibile, memorizzato su disco
-
Assembler, Linker & Loader 5
EsempioEsempio.globl mainmain:...
jal proc...
.globl procproc: addi $sp, $sp, -20
...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret
else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0
...addi $sp, $sp, 20jr $ra
.globl is_inis_in: addi $t0, $zero, 0
addi $t1, $zero, 0while: slt $t2, $t0, $a2
beq $t2, $zero, endsll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, incaddi $t1, $zero, 1j end
inc: addi $t0, $t0, 1j while
end: addi $v0, $t1, 0jr $ra
Assembler, Linker & Loader 6
LLassemblatoreassemblatore
Traduce un modulo in assembler in un file oggettoTraduce un modulo in assembler in un file oggetto Una combinazione diUna combinazione di
99 Istruzioni in linguaggio macchinaIstruzioni in linguaggio macchina99 Dati Dati 99 Informazioni per la corretta collocazione del modulo in memoria:Informazioni per la corretta collocazione del modulo in memoria:
RilocazioneRilocazione EsempioEsempio
99 Per poter tradurre in linguaggio macchina le istruzioni di saltoPer poter tradurre in linguaggio macchina le istruzioni di salto, , llassemblatore deve poter determinare gli indirizzi corrispondentiassemblatore deve poter determinare gli indirizzi corrispondenti alle alle etichette usate nei salti (etichette usate nei salti (tabella dei simbolitabella dei simboli))
99 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 dallIl file oggetto prodotto dallassemblatore assume che il assemblatore assume che il modulo parta dalla locazione di memoria 0 (indirizzi relativi)modulo parta dalla locazione di memoria 0 (indirizzi relativi) SarSar il il linkerlinker a gestire la a gestire la rilocazionerilocazione
99 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, semplice, salvo per le istruzioni con riferimenti a etichette locali non salvo per le istruzioni con riferimenti a etichette locali non ancora dichiarate (ancora dichiarate (riferimenti in avantiriferimenti in avanti: l: letichetta etichetta usata usata prima di essere definita) prima di essere definita)
Assemblatore a due passateAssemblatore a due passate Prima passataPrima passata: calcola la lunghezza delle istruzioni e genera una : calcola la lunghezza delle istruzioni e genera una
tabella dei simboli, contenente ltabella dei simboli, contenente lassociazione tra i nomi delle associazione tra i nomi delle etichette ed i corrispondenti indirizzi di memoriaetichette 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 velocitMaggiore velocit ma intera rappresentazione binaria in memoriama intera rappresentazione binaria in memoria
Assembler, Linker & Loader 8
Struttura del file oggettoStruttura del file oggetto
Nei sistemi Nei sistemi UnixUnix, il file oggetto , il file oggetto composto da 6 sezioni distintecomposto da 6 sezioni distinte ObjectObject file file headerheader (intestazione)(intestazione)
99 Dimensione e posizione delle altre parti del file oggettoDimensione e posizione delle altre parti del file oggetto Segmento di testoSegmento di testo
99 Codice in linguaggio macchina per le procedure nel file sorgenteCodice in linguaggio macchina per le procedure nel file sorgente; ; possono esserci riferimenti irrisolti (istruzioni contenenti rifpossono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a erimenti a simboli esterni)simboli esterni)
Segmento di datiSegmento di dati99 Rappresentazione binaria dei datiRappresentazione binaria dei dati
Informazioni di Informazioni di rilocazionerilocazione99 Identificazione di istruzioni e dati da aggiornare al momento deIdentificazione di istruzioni e dati da aggiornare al momento della lla
rilocazionerilocazione, in quanto dipendenti da indirizzi di memoria assoluti, in quanto dipendenti da indirizzi di memoria assoluti Tabella dei simboliTabella dei simboli
99 Simboli definiti nel modulo e Simboli definiti nel modulo e riferibili dallriferibili dallesternoesterno (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 Informazioni per il debuggerdebugger99 Descrizione concisa del modo in cui il programma Descrizione concisa del modo in cui il programma stato compilatostato compilato
-
Assembler, Linker & Loader 9
Esempio: Primo Passata Esempio: Primo Passata
EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00else2else2 0x600x60retret 0x640x64
.globl procproc: addi $sp, $sp, -20
...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret
else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0
...addi $sp, $sp, 20jr $ra
Tabella dei Simboli
Assembler, Linker & Loader 10
Esempio: Secondo PassataEsempio: Secondo Passata.globl procproc: addi $sp, $sp, -20
...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret
else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0
...addi $sp, $sp, 20jr $ra
addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x0addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal ???beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x64addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra
Generazione
Codice
Macchina
EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00else2else2 0x600x60retret 0x640x64
Tabella dei Simboli
EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00is_inis_in 0x4B0x4B
Tabella dei Simboli
IstrIstr.. IndirizzoIndirizzojaljal 0x380x38jaljal 0x4B0x4Bjj 0x5B0x5B
Relocation Information
Assembler, Linker & Loader 11
Il Il linkerlinker
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 degli i loro spazi degli
indirizziindirizzi Occorre risolvere tutti i riferimenti esterni Occorre risolvere tutti i riferimenti esterni tramite etichettetramite etichette
globali globali -- ossia le chiamate tra moduli e riferimenti a variabili ossia le chiamate tra moduli e riferimenti a variabili globaliglobali
Compiti del Compiti del linkerlinker (a partire dalla tabella dei simboli e dalle (a partire dalla tabella dei simboli e dalle informazioni di informazioni di rilocazionerilocazione)) 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 Il linkerlinker produce un file oggetto che pu essere eseguito sulla produce un file oggetto che pu essere eseguito sulla macchinamacchina Stesso formato del file oggetto ma con tutti i riferimenti risolStesso formato del file oggetto ma con tutti i riferimenti risolti e ti e
senza informazioni di senza informazioni di rilocazionerilocazione
Assembler, Linker & Loader 12
EsempioEsempio ...jal ???...
addi $t0, $zero, 0addi $t1, $zero, 0slt $t2, $t0, $a2beq $t2, $zero, 8sll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, 2addi $t1, $zero, 1j 0x30addi $t0, $t0, 1j 0x08addi $v0, $t1, 0jr $ra
addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x00addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal ???beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x64addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra
0x400000
0x4000AC
0x4000B0
0x400120
0x400124
0x400158
-
Assembler, Linker & Loader 13
EsempioEsempio ...jal 0x4000B0...
addi $t0, $zero, 0addi $t1, $zero, 0slt $t2, $t0, $a2beq $t2, $zero, 8sll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, 2addi $t1, $zero, 1j 0x400154addi $t0, $t0, 1j 0x40012Baddi $v0, $t1, 0jr $ra
addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x4000B0addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal 0x400124beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x400104addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra
0x400000
0x4000AC
0x4000B0
0x400120
0x400124
0x400158
Assembler, Linker & Loader 14
Istruzioni MIPS da Istruzioni MIPS da RilocareRilocare
Indirizzi relativi al PC (istruzioni Indirizzi relativi al PC (istruzioni beqbeq e e bnebne): da ): da non non rilocarerilocare LLindirizzamento relativo al PC indirizzamento relativo al PC preservato anche se il preservato anche se il
codice viene spostatocodice viene spostato Indirizzi assoluti (istruzioni j e Indirizzi assoluti (istruzioni j e jaljal): da ): da rilocarerilocare
sempresempre Da Da rilocarerilocare anche istruzioni anche istruzioni lwlw e e swsw che utilizzano che utilizzano
il registro il registro $gp$gp per indirizzare dati staticiper indirizzare dati statici Riferimenti esterni (tipicamente istruzione Riferimenti esterni (tipicamente istruzione jaljal): da ): da
rilocarerilocare sempresempre
Assembler, Linker & Loader 15
Il Il loaderloader
Una volta che il Una volta che il linkerlinker ha creato il file eseguibile, ha creato il file eseguibile, esso viene di solito memorizzato su discoesso viene di solito memorizzato su disco
AllAllatto dellatto dellesecuzione, il S.O. lo carica dal disco e esecuzione, il S.O. lo carica dal disco e ne avvia lne avvia lesecuzioneesecuzione
Il Il loaderloader si occupa di far partire il programmasi occupa di far partire il programma Legge lLegge lintestazione per determinare la dimensione dei 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 Copia nello stackstack i parametri (se presenti) passati al i parametri (se presenti) passati al mainmain InizializzaInizializza i registri e lo i registri e lo stackstack pointerpointer Salta ad una procedura di Salta ad una procedura di inizializzazioneinizializzazione che copia i che copia i
parametri nei registri appositi dallo parametri nei registri appositi dallo stackstack e poi invoca la e poi invoca la procedura di inizio del programma (procedura di inizio del programma (mainmain() in C)() in C)
Assembler, Linker & Loader 16
Librerie collegate dinamicamenteLibrerie collegate dinamicamente
Svantaggi del collegamento statico (prima Svantaggi del collegamento statico (prima delldellesecuzione del programma)esecuzione del programma) Le routine della libreria fanno parte del codice eseguibileLe routine della libreria fanno parte del codice eseguibile
99 Uso di vecchie versioni della libreria anche se disponibili Uso di vecchie versioni della libreria anche se disponibili nuove versioninuove versioni
Caricamento dellCaricamento dellintera libreria anche se usata 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
finchfinch il programma non viene eseguito il programma non viene eseguito Ogni routine viene collegata solo dopo essere invocata Ogni routine viene collegata solo dopo essere invocata
((lazylazy procedure procedure linkagelinkage) )