Compilazione separata

Похожие документы
Perché il linguaggio C?

Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

Organizzazione di un SO monolitico

STRUTTURA DI UN PROGRAMMA

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Preprocessore, linker e libreria standard

Primi passi col linguaggio C

Lezione 10: Librerie e compilazione separata

Il linguaggio Assembly

perror: individuare l errore quando una system call restituisce -1

Compilazione e Makefile

PER UTILIZZARE LCC IN LAB

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Introduzione a Visual Studio 2005

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Debug di un programma

COMPILAZIONE. Tarsformazione di linguaggi

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Calcolatori Elettronici Parte VIII: linguaggi assemblativi

Linguaggi di programmazione

Comandi principali di Linux (1)

COSTRUZIONE DI UN APPLICAZIONE

C: panoramica. Violetta Lonati

Linguaggi di alto livello, compilatori e interpreti

Il linguaggio C. Notate che...

PASSI DI SVILUPPO DI UN PROGRAMMA: ESEMPIO

Introduzione al DEV C++

Spazio di indirizzamento virtuale

L'Allocazione Dinamica della Memoria nel linguaggio C

L Allocazione Dinamica della Memoria

File binari e file di testo

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

Il linguaggio C. Puntatori e dintorni

Fondamenti di Informatica T-1 CdS Ingegneria Informatica. Introduzione agli ambienti di sviluppo MS Visual Studio 2005/2008/2010 CodeLite 6.1.

I programmi Assembler e Linker

Linguaggi, compilatori e interpreti

Il linguaggio C Il linguaggio C. Caratteristiche del C. Caratteristiche del C. Linguaggi di Programmazione I. Ferdinando Cicalese

Lab 01 Introduzione a Codelite

Introduzione alla programmazione

Il compilatore Dev-C++

Strutture Dati Dinamiche

Capitolo 5 - Funzioni

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Introduzione al linguaggio C Puntatori

La programmazione in linguaggio C

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

IL PRIMO PROGRAMMA IN C

Introduzione al Linguaggio C ed all IDE DEV-C++

I Linguaggi di Programmazione

Il generatore di numeri casuali

Il comando Make: : uno strumento per la compilazione ed esecuzione di software applicativo. A. Murli - Cacolo Scientifico a.a.

Aprire MPLAB. Cliccare sull icona presente sul Desktop

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Linguaggio C. Appunti per il corso di Laboratorio di Algoritmi e Strutture Dati. Stefano Aguzzoli

Dati aggregati. Violetta Lonati

Транскрипт:

Compilazione separata 1

Compilazione separata Finora abbiamo trattato solo programmi C contenuti in un unico file define/include typedef variabili globali prototipi F1..FN main def F1 def FN Struttura tipica di un sorgente C 2

Compilazione separata (2) Scopi di suddividere il codice sorgente C su più file per raggruppare un insieme di funzioni congruenti (e solo quelle) in un unico file per incapsulare un insieme di funzioni esportando solo quelle che vogliamo fare utilizzare agli altri (pubbliche) per compilare una volta per tutte un insieme di funzioni e metterlo a disposizione di altri in una libreria es. le librerie standard viste finora. 3

Compilazione separata (2.1) Problemi da risolvere (1) come si possono utilizzare funzioni definite in altri file? Vogliamo che il compilatore continui a fare i controlli di tipo etc (2) come posso compilare una volta per tutte le funzioni definite in un file separato? non voglio doverle ricompilare ogni volta che le uso in un altro file (come avviene per printf(), scanf() ) voglio che il codice assembler risultante possa essere facilmente specializzato per generare l eseguibile finale 4

Compilazione separata (3) Tipicamente : define/include glob.h typedef variabili globali fun_tok.h main main.c fun_1ton.h prototipi F1..Fk prototipi Fk+1..FN def F1 fun_tok.c def Fk+1 fun_ton.c def Fk def FN 5

define/include glob.h typedef variabili globali fun_tok.h #include glob.h #include fun_tok.h #include fun_ton.h... main.c fun_1ton.h prototipi F1..Fk prototipi Fk+1..FN ass F1 fun_tok.o ass Fk+1 fun_ton.o ass Fk ass FN 6

Compilazione separata (4) Per utilizzare delle funzioni definite in file diversi basta (1) specificare il prototipo (dichiarazione) prima dell uso tipicamente includendo un file che lo contiene (2) avere a disposizione una versione precompilata delle funzioni stesse (il modulo oggetto relativo al file che le contiene) Perché questo basta? 7

Compilazione separata (5) Perché basta? Il prototipo della funzione permette al compilatore di fare i controlli di tipo ogni funzione di cui non è noto il prototipo viene considerata void -> int questo genera errori strani ma non fa fallire la compilazione (provate a non includere stdio.h ) Dal modulo oggetto si può generare correttamente l eseguibile finale del programma che utilizza le funzioni definite separatamente senza ricompilarle da capo (cioè dal sorgente complessivo) 8

define/include glob.h typedef variabili globali fun_tok.h #include glob.h #include fun_tok.h #include fun_ton.h... main.c fun_1ton.h prototipi F1..Fk prototipi Fk+1..FN Modulo oggetto 1,k fun_tok.o Modulo oggetto k+1,n fun_ton.o 9

Compilazione separata Seconda parte 10

Compilazione separata (5.1) Partiamo da più file di testo define/include glob.h typedef variabili globali fun_tok.h main main.c fun_1ton.h prototipi F1..Fk prototipi Fk+1..FN def F1 fun_tok.c def Fk+1 fun_ton.c def Fk def FN 11

Compilazione separata (5.2) Vogliamo ottenere un unico eseguibile Formato di un eseguibile ELF File a.out Magic number Altre info Ampiezza BSS I-Data segment Text segment Numero che contraddistingue il file come eseguibile Ampiezza area di memoria occupata dalle variabili globali NON inizializzate Variabili globali inizializzate Codice del programma (assemblato) 12

Compilazione separata (5.3) L eseguibile contiene tutte le informazioni per creare la configurazione iniziale dello spazio di indirizzamento (loading) File a.out FRAME per la funzione main Stack 2 32-1 Magic number Altre info Ampiezza BSS I-Data segment Area vuota BSS-segment I-Data segment Data Text segment Text 0 13

Compilazione separata (6.0) file1.c preproc compil assembler modulo oggetto file1.o Opzioni del gcc permettono di fermarsi in corrispondenza dei vari passi file2.c preproc -E compil assembler -S file2.s linker -c file2.o a.out eseguibile 14

Compilazione separata (6) Come si crea il modulo oggetto? gcc -c file.c produce un file file.o che contiene il modulo oggetto di file.c Il formato dell oggetto dipende dal sistema operativo Che informazioni contiene l oggetto? L assemblato del sorgente testo e dati (si assume di partire dall indirizzo 0) La tabella di rilocazione La tabella dei simboli (esportati ed esterni) 15

Compilazione separata (7) Tabella di rilocazione identifica le parti del testo che riferiscono indirizzi assoluti di memoria es. JMP assoluti, riferimenti assoluti all area dati globali (LOAD, STORE ) questi indirizzi devono essere rilocati nell eseguibile finale a seconda della posizione della prima istruzione del testo (offset) all indirizzo contenuto nell istruzione ad ogni indirizzo rilocabile va aggiunto offset 16

Datimain datin main.o Testomain Ind inizio TabRiloc,TabSimbol Situazione iniziale eseguibile?? TabRiloc,TabSimbol Dati datink fun_tok.o Testo k TabRiloc,TabSimbol Dati datin Dati N datinn fun_ton.o Testo Testo N N 17

Compilazione separata (8) Tabella di rilocazione (cont.) il codice pre-compilato è formato da testo e dati binari l assemblatore assume che l indirizzo iniziale sia 0 ind Tabella di rilocazione X X 0 ind 18

Datimain datin Testomain Tr,ts Ind inizio Tr,ts Dati datink 0 main.o fun_tok.o Tr,ts Dati datin Dati N datinn Ind inizio Datimain Dati k Dati N Testomain Testo k Testo N 0 fun_ton.o Testo k 0 Testo Testo N N 0 19

Compilazione separata (9) Tabella di rilocazione (cont.) ad ogni indirizzo rilocabile va aggiunto offset, l indirizzo iniziale nell eseguibile finale ind + offset X + offset ind ind + offset offset 20

Compilazione separata (10) Tabella dei simboli identifica i simboli che il compilatore non è riuscito a risolvere, cioè quelli di cui non sa ancora il valore perché tale valore dipende dal resto dell eseguibile finale ci sono due tipi di simboli... definiti nel file ma usabili altrove (esportati) es. i nomi delle funzioni definite nel file, i nomi delle variabili globali usati nel file ma definiti altrove (esterni) es. le funzioni usate nel file ma definite altrove (tipo printf()) 21

Compilazione separata (11) Tabella dei simboli (cont.) per i simboli esportati, la tabella contiene nome, indirizzo locale per i simboli esterni contiene nome indirizzo della/e istruzioni che le riferiscono 22

Compilazione separata (12) Il linker si occupa di risolvere i simboli Analizza tutte le tabelle dei simboli. Per ogni simbolo non risolto (esterno) cerca in tutte le altre tabelle dei simboli esportati degli oggetti da collegare (linkare) assieme nelle librerie standard nelle librerie esplicitamente collegate (opzione -l) 23

Compilazione separata (12.1) Il linker si occupa di risolvere i simboli (cont.) Se il linker trova il simbolo esterno eventualmente ricopia il codice della funzione (linking statico) nell eseguibile usa l indirizzo del simbolo per generare la CALL giusta o il giusto riferimento ai dati Se non lo trova da errore... Provate a non linkare le librerie matematiche... 24

Compilazione separata (13) file1.c preproc compil assembler file1.o Opzioni del gcc permettono di fermarsi in corrispondenza dei vari passi file2.c preproc -E compil assembler -S file2.s linker -c file2.o eseguibile 25

Esempio: percolation... dmat2.o dmat2.c dmat2.h percolation_sol.c r.h Come costruire l eseguibile (1) $gcc -Wall -pedantic -c dmat2.c --crea dmat2.o 26

Esempio: percolation (2) dmat2.o percolation_sol.o dmat2.c dmat2.h percolation_sol.c r.h Come costruire l eseguibile (2) $gcc -Wall -pedantic -c percolation_sol.c --crea percolation_sol.o 27

Esempio: percolation (3) exe dmat2.o percolation_sol.o dmat2.c dmat2.h percolation_sol.c r.h Come costruire l eseguibile (3) $gcc dmat2.o percolation_sol.o -o exe --crea l eseguibile exe 28

Esempio: percolation (4) $gcc -Wall -pedantic -c dmat2.c --crea dmat2.o $gcc -Wall -pedantic -c percolation_sol.c --crea percolation_sol.o $gcc dmat2.o percolation_sol.o -o exe --crea l eseguibile exe se modifico dmat2.c devo rieseguire (1) e (3) se modifico dmat2.h devo rifare tutto 29

Esempio: percolation (5) $gcc -M dmat2.c --fa vedere le dipendenze da tutti i file anche dagli header standard delle librerie dmat2.o : dmat2.c /usr/include/stdio.h \ /usr/include/sys/types.h \ perché questo strano formato? per usarlo con il make. 30

Come visualizzare i moduli oggetto Comando nm options file.o fornisce tutti i simboli definiti in file.o $nm -g dmat2.o fornisce solo i simboli esportati Comandi objdump e readelf permettono di leggere le varie sezioni dell eseguibile $objdump -d dmat2.o fornisce il testo disassemblato -r tabelle di rilocazione -t symbol table Vedere anche info binutils da emacs 31