Strumenti Utente

Strumenti Sito


fisica:informatica:201415:esercitazioni:esercitazione11

Questa è una vecchia versione del documento!


Esercitazione compilazione separata e librerie

Esercizio 1: Libreria operazioni su vettori

Realizzare una libreria che fornisce alcune operazioni comuni su vettori:

/** stampa a sullo standard output */
void print_v (double* a, int n);
/** calcola c = a + b ; n da il numero di elementi dei tre vettori */
void sum_v (double* a, double* b, double* c, int n);
/** calcola il prodotto vettoriale
 
 a[0]*b[0] + ...... a[n-1]*b[n-1] 
 
  e lo restituisce come valore
 
 */
double innerprod_v (double* a, double* b, int n);
/** calcola il massimo valore e lo restituisce 
l'indice del massimo viene scritto nella variabile di indirizzo m_i
*/
double max_v(double* a, int n, int* m_i);
 
/** calcola il segmento di somma massima (vedi esercitazione del 25/03/2015)
*/
double ssm_v(double* a, int n, int* s_init, int* s_lung);

In C per realizzare una libreria si difinisce un file .h con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice pre-compilato in un opportuno file di libreria .a.

Nel nostro caso l'header si chiamera' vect.h e la libreria si chiamera' libVect.a.

Procedere nel modo seguente:

  • Definire un file vect.h che contiene i prototipi delle funzioni implementate (quelle nel riquadro sopra)
  • Definire un file vect.c che contiene il codice che implementa le funzioni.
  • Generare il modulo oggetto vect.o che contiene il codice precompilato delle funzioni, da inserire nella libreria. Il modulo oggetto puo' essere creato con il comando gcc come segue
$ gcc -Wall -pedantic -c vect.c
  • Creare la libreria con i lcomando ar come segue
$ ar -r libVect.a vect.o

Quando la creazione e' andata a buon fine per testarla creare un file main.c che contenga delle chiamate alle funzioni di libreria, ad esempio:

#include "./vect.h"
#define N 3
int main (void) {
  double a[N] = {3,4,5}, b[N] = {5, 1,7}, c[N];
  sum_v(a,b,c,N);
  print_v(c,N);
  return 0;
}

notate che :

  • il main di test deve includere il file vect.h, questo permette al compilatore di controllare i tipi delle chiamate al codice della libreria
  • in fase di compilazione per collegare (linking) il codice del nel file main.c a quello della libreria bisogna usare le opzioni -l e -L
$ gcc -Wall -pedantic main.c -lVect -L.

dove l'opzione -l indica il nome della libreria (non standard) da usare in fase di linking e l'opzione -L specifica la directory (non standard) dove cercarla (oltre alle directory standard tipo /usr/lib).

Esercizio 2: Ancora su -- Preprocessing, compilazione e linking

1) Compilare ed eseguire il seguente programma:

#include <stdio.h>
#include <math.h>
 
int main (void) {
  double x=3.0;
 
  printf("Radice = %f\n",sqrt(x));
  return 0;
}

salvato nel file ff.c con

gcc -Wall -pedantic ff.c

Chi segnala un errore? E' fallita la fase di preprocessing, la compilazione o il linking? Cosa contine il modulo oggetto se specifico l'opzione -c? Come si risolve il problema?

2) Cosa accade se eliminiamo la linea

#include <math.h>

? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile?

3) Generare il modulo oggetto con

gcc -Wall -pedantic -c ff.c

Utilizzare objdump, nm, readelf per capire cosa contengono la tabella di rilocazione, la tabella dei simboli esportati ed esterni, le sezioni data, BSS e codice. (utilizzare il man e cercare su google).

4) Usare l'opzione -E e la -S del gcc: che cosa succede? Cosa accade specificando il flag -g assieme a -S?

fisica/informatica/201415/esercitazioni/esercitazione11.1427726679.txt.gz · Ultima modifica: 30/03/2015 alle 14:44 (10 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki