Sistema Operatiu Linux

Unitat: Linux com a entorn de programació

Tema: compilació de programes en 'C'



 

Introducció: el compilador gcc, conceptes de compilador, preprocessador i enllaçador.

gcc programa.c
gcc programa.c -o programa.exe
gcc -E programa.c | more
veurem el nostre programa amb el fitxer <stdio.h> inclos.
gcc -S programa.c; cat programa.s
veurem el nostre programa en ensamblador.
A continuació realitzeu les següents proves amb gcc:
1. Obtenir el fitxer prova.i, i llisteu-lo per verificar que ara inclou el fitxer stdio.h
2. Obtenir el fitxer prova.s, i llisteu-lo per verificar que conté el programa en ensamblador
3. Obtenir el fitxer prova.o . ¿És pot executar aquest fitxer? ¿Perquè?
4. Obtenir el fitxer prova.exe i provar-lo

Llibreríes de funcions



PRÀCTICA: Creació d'una llibrería estàtica.

PRÀCTICA: Creació d'una llibrería dinàmica
 

Seguirem les següents passes:

1.Crear el fitxer objecte amb l'opció fPIC que genera codi independent de la posició, necessari per usar-lo en llibreríes compartides. Una llibrería dinàmica compartida (dynamic shared library) és aquella que permet que diversos programes en execució puguin enllaçar-se amb ella de forma simultània. Escriurem:.
    gcc -c -fPIC utils.c -o utils.o

2. Incorporar a la llibrería dinàmica l'objecte. Utilitzem l'opció shared per indicar que la llibrería és compartida entre diversos programes que la poden utilitzar simultàniament:
    gcc -shared utils.o -o biblio.so.1.0
Les llibreríes dinàmiques tenen la següent nomenclatura: nom.so.versió.revisió . Per tant em creat la llibrería dinàmica biblio.so en versió 1.0

3. Creem un enllaç a la llibrería dinàmica:
    ln -s biblio.so.1.0 biblio.so

4. Incluim el directori on està la nova llibrería en la llista de directoris de llibreríes del sistema, continguda en la variable d'entorn  LD_LIBRARY_PATH:
    LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH

5. La llibrería dinàmica està llesta. Per provar-la:
   gcc prova.c biblio.so -o prova2.exe

Exercici: Si ara movem o renombrem la llibrería biblio.so.1.0, continuarà funcionant el programa prova2.exe? Si fem el mateix amb la llibrería estàtica mibilio.a, funcionarà el programa prova.exe?


Depuració dels programes amb gdb

1. Recompilem el programa amb l'opció -g per tal de que el compilador afegeixi l'informació necessaria per el programa gdb:
     gcc -g prova.c biblio.so -o prova.exe
2. Iniciem gdb:
            gdb prova.exe
3. Es mostra el símbol del depurador:
(gdb)
4. Provarem a continuació els diferents comandaments de gdb:
 
 
run executar el programa
break [línia/funció] afegir un punt d'interrupció en la línia o en la funció
step executar la següent instrucció
kill aturar l'execució del programa
delete eliminar els punts d'interrupció
print [variable/funció]  mostrar el contingut de la variable o el resultat de la funció
set variable=valor  modificar el valor de la variable
continue continuar executant fins el següent punt d'interrupció o fins el final
Taula: comandaments de depuració en gdb
 
 Per exemple:
(gdb) break 4
(gdb) run
(gdb) step
(gdb) print  i
(gdb) set i=3
(gdb) continue
(gdb) quit
 
 

Exercicis

1. Afegir a la biblioteca mibiblio.a una funció void linea(int llarg) per escriure una línia d'asteriscs, tants com indiqui la variable llarg. Recompilar i provar la nova funció amb un programa de prova.
2. Eliminar la funció utils.o de la llibrería mibiblio.a   Comprobar que ha estat eliminada.
3. Tornar a incloure la funció utils.o en la llibrería mibiblio.a i comprobar-ho