L'étape suivante qui se produit au démarrage de votre ordinateur est le chargement d'init et son exécution. Cependant, init, comme la plupart des programmes, utilise des fonctions issues de bibliothèques.
Vous avez peut-être déjà vu un exemple de programme C comme celui-ci :
main() { printf("Hello World!\n"); }
Le programme ne définit nullement printf
, alors d'où vient-il ?
Il provient des bibliothèques C standard ("standard C libraries"), sur un
système GNU/Linux, glibc. Si vous les compilez sous Visual C++, alors il
provient d'une implémentation Microsoft de ces mêmes fonctions standard.
Il existe des milliers de ces fonctions standard, pour les mathématiques
(math), la gestion des chaînes de caractères (string), l'heure et la date,
l'allocation de mémoire et ainsi de suite. Tout, dans Unix (y compris Linux)
est soit écrit en C, soit tente de le simuler, de sorte que tous les
programmes utilisent ces fonctions.
Si vous jetez un oeil dans /lib
sur votre système Linux, vous
verrez un grand nombre de fichiers appelés libquelquechose.so
ou
libquelquechose.a
etc. Ce sont les bibliothèques de ces fonctions.
Glibc est simplement l'implémentation GNU de ces fonctions.
Les programmes peuvent utiliser ces fonctions de deux manières. si vous
"linkez" (NDT : "éditez les liens", opération qui consiste à établir les
relations avec les différents objets sollicités par le programme,
puis à créer l'exécutable) statiquement, ces fonctions seront
copiées à l'intérieur de l'exécutable généré. C'est à ça que servent les
bibliothèques libquelquechose.a
. Si vous linkez votre programme
dynamiquement (effectué par défaut), lorsque le programme aura
besoin du code d'une bibliothèque, il ira l'extraire directement du fichier
libquelquechose.so
La commande ldd
vous apporte une aide précieuse lorsque vous
cherchez à retrouver les bibliothèques utilisées par un programme
particulier. Par exemple, voici les bibliothèques utilisées par
bash
:
[greg@Curry power2bash]$ ldd /bin/bash libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000) libc.so.6 => /lib/libc.so.6 (0x4001d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Certaines fonctions, dans leur bibliothèque, dépendent du lieu où vous vous
trouvez. Par exemple, en français, on écrit les dates sous la forme
dd/mm/yy, mais les américains les écrivent mm/dd/yy. Il existe un programme
livré avec glibc
appelé localdef
qui vous donne la
possibilité de définir cela.
Utilisez ldd
pour déterminer les bibliothèques qu'utilise votre
application préférée.
Utilisez ldd
pour déterminer les bibliothèques utilisées par
init
.
Créez une bibliothèque gadget, avec seulement une ou deux fonctions dedans.
On utilise le programme ar
pour les créer. La page de manuel
d'ar
pourrait être un bon point de départ pour commencer à enquêter
sur la manière dont cette opération est effectuée. Ecrivez, compilez, et
linkez un programme utilisant cette bibliothèque.