Conception et vie d'un programme, partie 3 : chargement d'un exécutable

Magazine
Marque
GNU/Linux Magazine
Numéro
130
Mois de parution
septembre 2010


Résumé
Au cours des précédents articles, nous nous sommes familiarisés avec les étapes permettant de construire un programme binaire ainsi qu'avec le format ELF dans lequel il est stocké sur le disque. Ce mois-ci, nous allons découvrir comment le système charge ce format en vue de son exécution.

Comme pour les précédents articles, le système étalon sur lequel les exemples ont été effectués est une Ubuntu 9.10 32 bits. Il est recommandé de l'utiliser, au besoin à l'aide d'un émulateur comme QEmu ou VirtualBox, afin de retrouver les mêmes résultats.

Le fil rouge de cet article sera un simple Hello World dont nous ferons l'offense de rappeler le code source :

#include <stdio.h>

int main(int argc, char *argv[]) {

  puts("Hello, ELF!");

return 0;

}

Ce programme sera compilé vers un exécutable dynamique de la façon suivante :

$ gcc test.c -o test

Comme le premier article nous l'a expliqué, cette compilation ajoutera automatiquement une dépendance à la bibliothèque système C qui contient la fonction puts. Cette bibliothèque devra donc être disponible sur le système et chargée en même temps que le programme afin que celui-ci puisse s'exécuter.

Nous produirons également une version statique de ce programme :

$ gcc test.c -static -o test_static

Constatons au passage la...

Cet article est réservé aux abonnés. Il vous reste 96% à découvrir.
à partir de 21,65€ HT/mois/lecteur pour un accès 5 lecteurs à toute la plateforme
J'en profite