Il existe 3 types de fichiers objets.
Fichiers objets déplaçables
Contient du code machine sous une forme qui peut être combinée avec d'autres fichiers objets relocalisables au moment de la liaison, afin de former un fichier objet exécutable.
Si vous avez un a.c
fichier source, pour créer son fichier objet avec GCC, vous devez exécuter:
gcc a.c -c
Le processus complet serait: le préprocesseur (cpp) fonctionnerait sur ac Sa sortie (source fixe) alimentera le compilateur (cc1). Sa sortie (assemblage) alimentera l'assembleur (as), qui produira le fichier relocatable object file
. Ce fichier contient du code objet et des -g
métadonnées de liaison (et de débogage le cas échéant ), et n'est pas directement exécutable.
Fichiers d'objets partagés
Type spécial de fichier objet déplaçable pouvant être chargé dynamiquement, soit au moment du chargement, soit au moment de l'exécution. Les bibliothèques partagées sont un exemple de ces types d'objets.
Fichiers objets exécutables
Contient du code machine qui peut être directement chargé en mémoire (par le chargeur, par exemple execve ) et ensuite exécuté.
Le résultat de l'exécution de l'éditeur de liens sur plusieurs relocatable object files
est un fichier executable object file
. L'éditeur de liens fusionne tous les fichiers d'objets d'entrée à partir de la ligne de commande, de gauche à droite, en fusionnant toutes les sections d'entrée de même type (par exemple .data
) dans la section de sortie de même type. Il utilise symbol resolution
et relocation
.
Bonus lu:
Lors de la liaison avec un, static library
les fonctions référencées dans les objets d'entrée sont copiées dans l'exécutable final. Avec dynamic libraries
une table de symboles est créée à la place qui permettra une liaison dynamique avec les fonctions / globaux de la bibliothèque. Ainsi, le résultat est un fichier objet partiellement exécutable, car il dépend de la bibliothèque. Si la bibliothèque n'existe pas, le fichier ne peut plus s'exécuter).
Le processus de liaison peut être effectué comme suit:
ld a.o -o myexecutable
La commande: gcc a.c -o myexecutable
invoquera toutes les commandes mentionnées au point 1 et au point 3 (cpp -> cc1 -> as -> ld 1 )
1: est en fait collect2, qui est un wrapper sur ld.