Compilation, dition de liens, fichiers objets,
librairies statiques et dynamiques
Nous allons cr er un fichier source de librairie, comportant plusieurs fonctions, mais ne comportant
pas de fonction main. Ce fichier source de librairie pourra tre compil selon 3 niveaux diff rents :
1 - en un fichier objet (extension .o)
2 - en un fichier de librairie statique (extension .a)
3 - en un fichier de librairie dynamique (extension .so)
Nous verrons ensuite comment un programme principal en C (comportant une fonction main) peut
faire appel aux diff rentes fonctions de la librairie.
Les fichiers sources
Voici le code source toto.c de la librairie toto :
#include <stdio.h>
int ma_variable=5;
void ma_fonction()
{
printf("Bienvenue dans Ma Fonction !\n");
}
int mon_addition(int i,int j)
{
printf("Bienvenue dans Mon Addition !\n");
return (i+j);
}
Et voici son fichier d'en-t te toto.h, ne d clarant que les prototypes des fonctions et des variables
globales :
int ma_variable;
void ma_fonction();
int mon_addition(int i,int j);
Remarques :
-
-
le fichier d'en-t te toto.h associ au source toto.c n'est pas g n r automatiquement : il faut
l' crire " la main"
- dans la liste des param tres pass s aux fonctions, il faut pr ciser explicitement le type de
chaque variables, m me si plusieurs param tres sont de m me type. Exemple : int i,j ne
marche pas. Il faut crire int i, int j
Voici le code source titi.c du programme principal. Ce programme invoque le fichier d'en-t te toto.h de
la librairie toto, et fait appel aux fonctions et aux variables globales de cette librairie :
#include <stdio.h>
#include "toto.h"
int main(void)
{
printf("---- D but du programme principal ----\n");
ma_fonction();
printf("Ma_variable vaut : %i\n",ma_variable);
printf("6+7=%i\n",mon_addition(6,7));
printf("---- Fin du programme principal ----\n");
return 0;
}
Remarque :
#include "toto.h" indique que le fichier d'en-t te toto.h se trouve dans le r pertoire courant (le
r pertoire de titi.c). Si on met #include <toto.h>, alors gcc cherchera le fichier d'en-t te toto.h dans le
r pertoire /usr/include
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 1/10
La compilation des fichiers sources
1 - Cr ation et utilisation d'un fichier objet
Pour compiler le fichier toto.c en un fichier toto.o, on utilise le param tre -c de gcc, qui indique gcc
d'arr ter son travail apr s la compilation (sans appeler l' diteur de lien) :
gcc -c toto.c
On obtient alors le fichier objet toto.o
Le programme objdump permet de savoir quelles fonctions sont pr sentes dans le fichier objet toto.o.
Si on tape objdump -t toto.o, on obtient la table des symboles du fichier objet :
toto.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df ABS 00000000 toto.c
00000000 l d .text 00000000
00000000 l d .data 00000000
00000000 l d .bss 00000000
00000000 l d .rodata
00000000 l d .note.GNU-stack
00000000 l d .comment
00000000 g O .data 00000004 ma_variable
00000000 g F .text 00000018 ma_fonction
00000000 UND 00000000 printf
00000018 g F .text 0000001e mon_addition
00000000
00000000
00000000
Comment compiler le programme principal titi.c ?
Commen ons par essayer une compilation simple :
gcc titi.c
On obtient alors, sans grande surprise, l'erreur suivante de la part de l' diteur de lien :
/tmp/ccIbKgIE.o(.text+0x21): In function `main':
: undefined reference to `ma_fonction'
/tmp/ccIbKgIE.o(.text+0x43): In function `main':
: undefined reference to `mon_addition'
collect2: ld returned 1 exit status
Cette erreur indique que le code des fonctions ma_fonction et mon_addition n'ont pas t trouv par
' diteur de lien. C'est normal car le code de ces fonctions est dans la librairie toto, et que seul le fichier
d'en-t te de cette librairie a t indiqu dans le programme source : gcc ne conna t donc pas le corps
des fonctions.
Pour indiquer gcc d'utiliser le fichier objet toto.o lors de l' dition de lien, la ligne de commande est :
gcc titi.c toto.o
Il n'y a alors plus d'erreur de lien, et on obtient un fichier a.out ex cutable. Si on lance a.out, on obtient
---- D but du programme principal ----
Bienvenue dans Ma Fonction !
Ma_variable vaut : 5
Bienvenue dans Mon Addition !
6+7=13
---- Fin du programme principal ----
Le programme titi.c a donc r ussit utiliser les fonctions ma_fonction et mon_addition dont le code est
ans le fichier objet toto.o. Remarque : la d claration de la variable globale ma_variable est pr sente
(et suffisante) dans le fichier d'en-t te toto.h.
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 2/10
2 - Cr ation et utilisation d'une librairie statique
Sous Linux, un fichier de librairie statique porte l'extension .a
Pour convertir le fichier objet toto.o en une librairie statique libtoto.a, il faut utiliser les 2 lignes de
commande suivantes :
Publicité
ar cr libtoto.a toto.o
ranlib libtoto.a
On obtient un fichier libtoto.a, dont la table des symboles donn e par objdump -t libtoto.a est :
toto.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df ABS 00000000 toto.c
00000000 l d .text 00000000
00000000 l d .data 00000000
00000000 l d .bss 00000000
00000000 l d .rodata 00000000
00000000 l d .note.GNU-stack 00000000
00000000 l d .comment 00000000
00000000 g O .data 00000004 ma_variable
00000000 g F .text 00000018 ma_fonction
UND 00000000 printf
00000018 g F .text 0000001e mon_addition
Pour compiler titi.c en faisant appel aux fonctions de la librairie statique libtoto.a, il suffit de passer en
param tre gcc le nom du fichier de la librairie statique (exactement comme pour un fichier objet) :
gcc titi.c libtoto.a
On obtient alors un fichier a.out ex cutable. Si on lance a.out, on obtient :
---- D but du programme principal ----
Bienvenue dans Ma Fonction !
Ma_variable vaut : 5
Bienvenue dans Mon Addition !
6+7=13
---- Fin du programme principal ----
Remarque : dans les 2 cas pr c dents (utilisation d'un fichier objet et utilisation d'une librairie
statique), le code des fonctions ma_fonction et mon_addition provenant initialement de la librairie
toto.c a t introduit dans le fichier ex cutable a.out.
Avantage : le fichier a.out n'est plus d pendant des librairies install es dans le syst me
Inconv nient : si on modifie la librairie toto.c, il faudra alors recompiler titi.c pour obtenir un nouveau
programme ex cutable a.out utilisant la nouvelle librairie
3 - Cr ation et utilisation d'une librairie dynamique
Sous Linux, un fichier de librairie dynamique porte l'extension .so
Pour convertir le fichier objet toto.o en une librairie dynamique libtoto.so, la ligne de commande est :
gcc -o libtoto.so -shared toto.o
On obtient alors un fichier de librairie dynamique libtoto.so
La commande objdump -t libtoto.so permet d'obtenir la table des symboles de la librairie dynamique :
libtoto.so: file format elf32-i386
SYMBOL TABLE:
000000b4 l d .hash 00000000
000001f0 l d .dynsym 00000000
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 3/10
00000470 l d .dynstr 00000000
00000532 l d .gnu.version 00000000
00000584 l d .gnu.version_r 00000000
000005b4 l d .rel.dyn 00000000
000005fc l d .rel.plt 00000000
0000060c l d .init 00000000
00000624 l d .plt 00000000
00000660 l d .text 00000000
000007b4 l d .fini 00000000
000007e0 l d .rodata 00000000
00000820 l d .eh_frame 00000000
00001824 l d .data 00000000
00001830 l d .dynamic 00000000
000018f8 l d .ctors 00000000
00001900 l d .dtors 00000000
00001908 l d .jcr 00000000
0000190c l d .got 00000000
0000192c l d .bss 00000000
00000000 l d .comment 00000000
00000000 l d .debug_aranges 00000000
00000000 l d .debug_info 00000000
00000000 l d .debug_abbrev 00000000
00000000 l d .debug_line 00000000
00000000 l d ABS 00000000
00000000 l d ABS 00000000
00000000 l d ABS 00000000
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
.3.3/build-i586-linux/csu/crti.S
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
.3.3/build-i586-linux/csu/defs.h
00000000 l df ABS 00000000 initfini.c
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
.3.3/build-i586-linux/csu/crti.S
00000000 l df ABS 00000000 <command line>
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
.3.3/build-i586-linux/config.h
00000000 l df ABS 00000000 <command line>
00000000 l df ABS 00000000 <built-in>
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
.3.3/build-i586-linux/csu/crti.S
00000660 l F .text 00000000 call_gmon_start
00000000 l df ABS 00000000 crtstuff.c
000018f8 l O .ctors 00000000 __CTOR_LIST__
00001900 l O .dtors 00000000 __DTOR_LIST__
00001908 l O .jcr 00000000 __JCR_LIST__
00001828 l O .data 00000000 p.0
0000192c l O .bss 00000001 completed.1
00000690 l F .text 00000000 __do_global_dtors_aux
00000700 l F .text 00000000 frame_dummy
00000000 l df ABS 00000000 crtstuff.c
000018fc l O .ctors 00000000 __CTOR_END__
00001904 l O .dtors 00000000 __DTOR_END__
00000820 l O .eh_frame 00000000 __FRAME_END__
00001908 l O .jcr 00000000 __JCR_END__
00000780 l F .text 00000000 __do_global_ctors_aux
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
2.3.3/build-i586-linux/csu/crtn.S
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
2.3.3/build-i586-linux/csu/defs.h
00000000 l df ABS 00000000 initfini.c
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
2.3.3/build-i586-linux/csu/crtn.S
00000000 l df ABS 00000000 <command line>
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
2.3.3/build-i586-linux/config.h
00000000 l df ABS 00000000 <command line>
Publicité
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 4/10
00000000 l df ABS 00000000 <built-in>
00000000 l df ABS 00000000 /home/gb/rpm/BUILD/glibc-
2.3.3/build-i586-linux/csu/crtn.S
00000000 l df ABS 00000000 toto.c
00001824 l O .data 00000000 .hidden __dso_handle
00000760 g F .text 0000001e mon_addition
00001830 g O ABS 00000000 _DYNAMIC
0000182c g O .data 00000004 ma_variable
0000060c g F .init 00000000 _init
0000192c g ABS 00000000 __bss_start
00000000 F UND 0000002b printf@@GLIBC_2.0
000007b4 g F .fini 00000000 _fini
00000000 w F UND 0000008f __cxa_finalize@@GLIBC_2.1.3
0000192c g ABS 00000000 _edata
0000190c g O ABS 00000000 _GLOBAL_OFFSET_TABLE_
00001930 g ABS 00000000 _end
00000748 g F .text 00000018 ma_fonction
00000000 w UND 00000000 _Jv_RegisterClasses
00000000 w UND 00000000 __gmon_start__
Pour compiler titi.c en utilisant la librairie dynamique libtoto.so il faut indiquer gcc 2 informations :
1 - quelle librairie dynamique l' diteur de lien doit-il utiliser : param tre l
2 - dans quel r pertoire se trouve le fichier .so de la librairie dynamique : param tre L
La compilation de titi.c en utilisant la librairie dynamique toto se fait alors avec la ligne de commande
suivante :
gcc -ltoto -L. titi.c
ltoto indique l' diteur de lien d'utiliser le fichier de librairie dynamique libtoto.so
-L. indique que le fichier de librairie dynamique se trouve dans le r pertoire courant
Si le param tre -L n'est pas pass gcc, l' diteur de lien recherche alors les fichiers .so de librairie
dynamiques dans le r pertoire /usr/lib
4 - Remarque et r capitulation concernant la compilation avec gcc
gcc toto.c -> compilation + dition de lien -> on obtient un fichier
ex cutable a.out
gcc -c toto.c -> compilation seulement -> on obtient un fichier objet
toto.o
gcc toto.o -> dition de lien seulement (utilisation du linkeur LD) -> on
obtient un ex cutable a.out
Pour obtenir un ex cutable, il faut une et une seule fonction main dans l'ensemble des sources et des
librairies. Si un programme fait appel des fonctions ext rieures qui ne sont pas d finit dans son code
source, il faut l'indiquer gcc sur la ligne de commande. Exemple : le programme titi.c faut appel
des fonctions contenues dans toto.c. Il y a alors 4 mani res de compiler titi.c :
1 - Avec le fichier source de toto.c : gcc titi.c toto.c
2 - Avec le fichier objet toto.o de toto.c : gcc titi.c toto.o
3 - Avec la librairie statique libtoto.a de toto.c : gcc titi.c libtoto.a
4 - Avec la librairie dynamique libtoto.so de toto.c : gcc titi.c ltoto
Ces 4 lignes de commande g n rent un ex cutable a.out dont le point d'entr e est la fonction main()
de titi.c. Enfin, le programme objdump permet d'aller voir les symboles pr sents dans :
-
-
-
-
un fichier objet
une librairie statique
une librairie dynamique
un fichier ex cutable ELF32 (a.out)
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 5/10
5 - Utilitaires suppl mentaires pour l'administration des
biblioth ques partag es
"
"
ldd <prog> permet de savoir quelle(s) biblioth que(s)
la commande
partag e(s) le programme <prog> utilise ;
la commande ldconfig r g n re tous les liens symboliques dans les
r pertoires contenant des biblioth ques partag es (ces r pertoires sont
r pertori s dans le fichier /etc/ld.so.conf ). Les r pertoires /lib et /usr/lib sont
pris en charge par d faut. L'usage des liens symboliques permet de conserver
plusieurs versions de chaque biblioth que, tout en passant de l'une l'autre
en un seul appel syst me : ainsi la mise jour d'une biblioth que peut se faire
sans arr ter le syst me ! ldconfig -v affiche l'ensemble des librairies install es
dans le syst me.
" La commande export LD_librarie_PATH=pwd permet de rajouter
le
r pertoire courant au chemin de recherche des librairie partag es (exactement
comme l'option -L. de gcc)
" La commande ltrace permet de suivre les appels des fonctions de
biblioth ques dynamiques effectu s par un programme, exactement de la
m me fa on que strace le fait pour les appels syst me : de m me que strace,
c'est un outil pr cieux pour tudier le comportement d'un programme qui ne
fonctionne pas correctement.
Exemple : si le programme a.out a t compil en utilisant la biblioth que partag e libtoto.so, alors la
commande ltrace a.out renvoie :
__libc_start_main(0x0804850c, 1, 0xbffff6c4, 0x08048580, 0x080485d0 <unfinished ...>
printf("---- D\351but du programme princ"...---- D but du programme principal ----
) = 39
ma_fonction(0x40016640, 0x080485d0, 0xbffff698, 0x4003e95d, 1 <unfinished ...>
printf("Bienvenue dans Ma Fonction !\n"Bienvenue dans Ma Fonction !
) = 29
<... ma_fonction resumed> ) = 29
printf("Ma_variable vaut : %i\n", 5Ma_variable vaut : 5
) = 21
mon_addition(6, 7, 0xbffff638, 0x08048531, 0x40016640 <unfinished ...>
printf("Bienvenue dans Mon Addition !\n"Bienvenue dans Mon Addition !
) = 30
<... mon_addition resumed> ) = 13
printf("6+7=%i\n", 136+7=13
) = 7
printf("---- Fin du programme principal "...---- Fin du programme principal ----
) = 37
+++ exited (status 0) +++
La commande ltrace -l libtoto.so a.out renvoie :
---- D but du programme principal ----
ma_fonction(0x40016640, 0x080485d0, 0xbffff698, 0x4003e95d, 1Bienvenue dans Ma Fonction !
) = 29
Ma_variable vaut : 5
mon_addition(6, 7, 0xbffff638, 0x08048531, 0x40016640Bienvenue dans Mon Addition !
) = 13
Publicité
6+7=13
---- Fin du programme principal ----
+++ exited (status 0) +++
Et la commande ldd a.out renvoie :
linux-gate.so.1 => (0xffffe000)
libtoto.so => /usr/lib/libtoto.so (0x40027000)
libc.so.6 => /lib/tls/libc.so.6 (0x40029000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
On voit bien travers cette derni re commande que le programme a.out fait appel la librairie
partag e libtoto.so.
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 6/10
Utilisation de librairies existantes dans le syst me
La plupart des fonctions l mentaires dont un programmeur a besoin sont g n ralement d j
programm es dans des librairies install es. Par exemple, pour afficher une image JPG il n'est
nullement besoin de r - crire un d codeur JPG : il suffit de faire appel une fonction d'affichage
d'image JPG. Oui, mais laquelle, et dans quelle librairie se trouve-t-elle ? Pareil pour lire un fichier
MP3, ou encore pour acc der au r seau.
1 - Comment conna tre les librairies disponibles dans le syst me ?
La commande ldvonfig -v affiche l'ensemble des librairies install es dans le syst me. Recherchons
une librairies contenant des routines relatives au traitement des images JPEG :
ldvonfig -v | grep jpeg
On constate que la librairie libjpeg.so est install e dans le syst me. O se trouve le fichier de librairie
dynamique libjpeg.so ?
whereis libjepg.so
On obtient comme r sultat l'emplacement /usr/lib/libjpeg.so
2 - Comment conna tre les fonctions disponibles dans une librairie du
syst me ?
Quelles fonctions contient cette librairie libjpeg.so ? Pour cela, affichons sa table de symboles gr ce
objdump :
objdump -T /usr/lib/libjpeg.so
Parmi tous les r sultats affich s, les fonctions de la librairies sont pr c d es du mot Base. Filtrons la
sortie de objdump gr ce grep afin d'affiner le r sultat :
objdump -T /usr/lib/libjpeg.so | grep Base
On obtient alors la liste des 110 fonctions disponibles dans la librairie dynamique libjpeg.so :
00009320 g DF .text 000002b5 Base jpeg_gen_optimal_table
00002d30 g DF .text 0000028b Base jpeg_copy_critical_parameters
000068d0 g DF .text 00000103 Base jinit_c_prep_controller
0000d640 g DF .text 0000007c Base jinit_input_controller
0000bf00 g DF .text 000000ae Base jpeg_read_scanlines
0001afa0 g DF .text 00000020 Base jpeg_get_small
000147c0 g DF .text 000004c2 Base jpeg_idct_float
000039e0 g DF .text 000003fd Base jpeg_set_colorspace
000035e0 g DF .text 0000003a Base jpeg_quality_scaling
00003ef0 g DF .text 0000036b Base jpeg_simple_progression
0000ae60 g DF .text 00000245 Base jpeg_fdct_ifast
0000ff00 g DF .text 00000394 Base jpeg_make_d_derived_tbl
0001e4fc g DO ABS 00000000 Base _DYNAMIC
00015b00 g DF .text 00000040 Base jpeg_idct_1x1
000103f0 g DF .text 0000014a Base jpeg_huff_decode
00014c90 g DF .text 00000764 Base jpeg_idct_islow
0000cf00 g DF .text 00000064 Base jinit_master_decompress
0000c610 g DF .text 000002ce Base jpeg_calc_output_dimensions
00003550 g DF .text 00000082 Base jpeg_set_linear_quality
000029a0 g DF .text 0000001f Base jpeg_write_m_byte
00019ac0 g DF .text 0000002d Base jround_up
00003800 g DF .text 00000149 Base jpeg_set_defaults
0001b050 g DF .text 00000003 Base jpeg_mem_init
00019aa0 g DF .text 00000011 Base jdiv_round_up
0000a6d0 g DF .text 0000005f Base jinit_phuff_encoder
0001b030 g DF .text 00000019 Base jpeg_open_backing_store
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 7/10
0000b780 g DF .text 00000020 Base jpeg_abort_decompress
0000bce0 g DF .text 00000117 Base jpeg_start_decompress
00007970 g DF .text 000001ed Base jinit_color_converter
00019a00 g DF .text 0000003b Base jpeg_destroy
00019af0 g DF .text 0000006c Base jcopy_sample_rows
0000ce60 g DF .text 00000092 Base jpeg_new_colormap
0000c1c0 g DF .text 000000ef Base jpeg_read_coefficients
00019a70 g DF .text 0000002b Base jpeg_alloc_huff_table
00016880 g DF .text 000001cd Base jinit_color_deconverter
00006170 g DF .text 000000f4 Base jinit_c_main_controller
00001fd0 g DF .init 00000000 Base _init
0001e300 g DO .data 000001fc Base jpeg_std_message_table
000028b0 g DF .text 0000008c Base jpeg_write_marker
000102a0 g DF .text 0000014f Base jpeg_fill_bit_buffer
00019050 g DF .text 000001c0 Base jinit_2pass_quantizer
000198a0 g DF .text 000000d5 Base jinit_merged_upsampler
00009740 g DF .text 00000064 Base jinit_huff_encoder
0000b0b0 g DF .text 00000234 Base jpeg_fdct_float
0000b760 g DF .text 00000020 Base jpeg_destroy_decompress
00019e00 g DF .text 00000077 Base jpeg_std_error
0000b640 g DF .text 0000011f Base jpeg_CreateDecompress
0001b960 g DO .rodata 00000140 Base jpeg_natural_order
0001b060 g DF .text 00000001 Base jpeg_mem_term
00012480 g DF .text 0000012c Base jinit_d_main_controller
00013da0 g DF .text 000000f5 Base jinit_d_post_controller
00005fa0 g DF .text 0000007d Base jinit_marker_writer
0000b2f0 g DF .text 0000034a Base jpeg_fdct_islow
00002bd0 g DF .text 000000d9 Base jpeg_write_raw_data
000178b0 g DF .text 000000ee Base jinit_1pass_quantizer
0001ae20 g DF .text 0000017c Base jinit_memory_mgr
0000bbb0 g DF .text 00000047 Base jpeg_has_multiple_scans
000141d0 g DF .text 000005ec Base jpeg_idct_ifast
0001b020 g DF .text 00000005 Base jpeg_mem_available
00019ba0 g DF .text 00000030 Base jzero_far
00014110 g DF .text 000000b1 Base jinit_inverse_dct
0000ba80 g DF .text 000000d7 Base jpeg_consume_input
00015850 g DF .text 000002a1 Base jpeg_idct_2x2
0000bb60 g DF .text 00000047 Base jpeg_input_complete
00013870 g DF .text 00000182 Base jinit_d_coef_controller
000026d0 g DF .text 00000054 Base jpeg_suppress_tables
00010b20 g DF .text 00000068 Base jinit_huff_decoder
000026b0 g DF .text 00000020 Base jpeg_abort_compress
0001e748 g D ABS 00000000 Base __bss_start
0000fcd0 g DF .text 00000071 Base jpeg_set_marker_processor
00003450 g DF .text 000000fc Base jpeg_add_quant_table
00019980 g DF .text 00000074 Base jpeg_abort
Publicité
0000b9d0 g DF .text 000000a2 Base jpeg_read_header
00002a30 g DF .text 00000092 Base jpeg_start_compress
00019a40 g DF .text 0000002b Base jpeg_alloc_quant_table
00002690 g DF .text 00000020 Base jpeg_destroy_compress
000029c0 g DF .text 00000062 Base jpeg_write_tables
00003950 g DF .text 0000008a Base jpeg_default_colorspace
00011be0 g DF .text 00000098 Base jinit_phuff_decoder
0001afe0 g DF .text 00000020 Base jpeg_get_large
0000bc00 g DF .text 000000d2 Base jpeg_finish_decompress
0000f950 g DF .text 00000154 Base jpeg_resync_to_restart
0000c4c0 g DF .text 000000b6 Base jpeg_stdio_src
00002580 g DF .text 00000102 Base jpeg_CreateCompress
0001b0a4 g DF .fini 00000000 Base _fini
0001b000 g DF .text 00000020 Base jpeg_free_large
0000ad90 g DF .text 000000c3 Base jinit_forward_dct
00004470 g DF .text 000000fc Base jinit_compress_master
0000faf0 g DF .text 0000008c Base jinit_marker_reader
00002730 g DF .text 00000174 Base jpeg_finish_compress
0000bfb0 g DF .text 000000c1 Base jpeg_read_raw_data
0001e748 g D ABS 00000000 Base _edata
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 8/10
0001e5d8 g DO ABS 00000000 Base _GLOBAL_OFFSET_TABLE_
0001e74c g D ABS 00000000 Base _end
00015400 g DF .text 0000044f Base jpeg_idct_4x4
00002940 g DF .text 00000054 Base jpeg_write_m_header
000084e0 g DF .text 0000024a Base jinit_downsampler
00003620 g DF .text 0000003a Base jpeg_set_quality
00004400 g DF .text 0000006f Base jpeg_stdio_dest
0000fb80 g DF .text 0000014a Base jpeg_save_markers
00002ad0 g DF .text 000000fb Base jpeg_write_scanlines
00019b60 g DF .text 00000033 Base jcopy_block_row
00002cb0 g DF .text 00000076 Base jpeg_write_coefficients
0001afc0 g DF .text 00000020 Base jpeg_free_small
0000c110 g DF .text 000000ad Base jpeg_finish_output
00005280 g DF .text 00000135 Base jinit_c_master_control
0000c080 g DF .text 00000087 Base jpeg_start_output
00007310 g DF .text 00000120 Base jinit_c_coef_controller
00008950 g DF .text 0000026a Base jpeg_make_c_derived_tbl
000160e0 g DF .text 000002dd Base jinit_upsampler
Parmi toutes ces fonctions on trouve la fonction jpeg_read_header (en gras ci-dessus) qui permet de
lire l'en-t te d'un fichier JPEG, afin de conna tre, par exemple, la r solution en pixels de l'image. Avant
d'utiliser cette fonction pour afficher la r solution d'une image JPEG, il nous faut trouver dans le
syst me le fichier d'en-t te (avec l'extension .h) relatif cette librairie partag e libjpeg.so.
3 - O retrouver le fichier d'en-t te relatif une librairie ?
Les fichiers d'en-t te relatifs aux librairies partag e du syst me, et que l'utilisateur peut utiliser dans
ses programmes en C, sont g n ralement enregistr s dans le r pertoire /usr/include. Recherchons
dans ce r pertoire un fichier dont le nom contient jpeg :
ls /usr/include/jpeg.h
On obtient alors le fichier /usr/include/jpeglib.h
ATTENTION : le fichier de libraire partag e s'appelle libjpeg.so mais le fichier d'en-t te s'appelle
jpeglib.h
Pour utiliser les fonctions et les types de la librairie libjpeg.so il suffit de rajouter #include <jpeglib.h>
au d but du programme.
4 - Exemple d'utilisation de la librairie libjpeg.so :
Le programme en C suivant affiche la r solution d'un fichier image toto.jpg :
/ Ce programme test.c affiche la r solution /
/ d'une image toto.jpg en utilisant la librairie libjpeg.so /
#include <stdio.h>
#include <jpeglib.h>
int main(void)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *file;
char *fichier="toto.jpg";
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
if ((file=fopen(fichier,"rb"))==NULL)
{
fprintf(stderr,"Erreur : impossible d'ouvrir le fichier texture.jpgn");
exit(1);
}
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 9/10
jpeg_stdio_src(&cinfo, file);
jpeg_read_header(&cinfo, TRUE);
printf("La largeur de l'image est %i pixels\n",cinfo.image_width);
printf("La hauteur de l'image est %i pixels\n",cinfo.image_height);
return (0);
}
Pour le compiler on utilisera la ligne de commande suivante (l' diteur de lien fait appel la librairie
libjpeg.so) :
gcc -ljpeg test.c
Et si on lance l'ex cutable a.out obtenu, on obtient l' cran :
La largeur de l'image est 400 pixels
La hauteur de l'image est 342 pixels
O trouver de laide
Les fichiers daides (.doc) des diff rentes librairies install es dans le syst me se trouvent dans le
r pertoire /usr/share/doc.
Pour aller plus loin
Utilisation de librairies partag es en Perl
Le programme h2xs permet de convertir un fichier d'en-t te .h en un module Perl .pm afin qu'un
programme Perl puisse utiliser une librairie partag e crite en C. Utilisons la librairie toto.c et son
fichier d'ent te d crits ci-dessus :
h2xs toto.h
Distribution d'une librairie partag e dans un fichier RPM
L'option -ba du programme RPM permet de se fabriquer ses propres fichiers RPM, en ligne de
commande.
Retrouvez de nombreux autres articles
concernant la programmation Linux
sur le site www.gecif.net
Compilation, dition de liens, fichiers objets, librairies
www.gecif.net
Page 10/10