Il existe 3 types de fichiers objets.
Fichiers d'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
pour créer son fichier objet avec GCC, vous devez exécuter : gcc a.c -c
Le processus complet serait le suivant : le préprocesseur (cpp) s'exécuterait sur a.c. Sa sortie (toujours source) alimenterait le compilateur (cc1). Sa sortie (assemblage) alimentera l'assembleur (as), qui produira le fichier relocatable object file
. Ce fichier contient le code objet et la liaison (et le débogage si -g
a été utilisé), et n'est pas directement exécutable.
Fichiers d'objets partagés
Type spécial de fichier objet déplaçable qui peut être chargé dynamiquement, soit au moment du chargement, soit au moment de l'exécution. Les bibliothèques partagées sont un exemple de ce type d'objets.
Fichiers d'objets exécutables
Contiennent du code machine qui peut être directement chargé en mémoire (par le chargeur, par ex. execve ) et ensuite exécuté.
Le résultat de l'exécution du linker sur plusieurs relocatable object files
est un executable object file
. L'éditeur de liens fusionne tous les fichiers d'objets d'entrée de la ligne de commande, de gauche à droite, en fusionnant toutes les sections d'entrée de même type (par ex. .data
) vers la section de sortie du même type. Il utilise symbol resolution
y relocation
.
Bonus de lecture :
Lorsque l'on établit un lien avec un static library
les fonctions qui sont 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/globales 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 être exécuté).
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 : il s'agit en fait de collect2, qui est une enveloppe sur ld.
0 votes
Une version plus active de ceci : stackoverflow.com/questions/12122446/
0 votes
Voir aussi Code assembleur, code machine ou code objet ?
0 votes
Les fichiers objets ne sont pas spécifiques au C