Qu'est-ce que le format de fichier O ?
Un fichier .o est un fichier objet compilé - un binaire intermédiaire produit par un compilateur tel que GCC ou Clang lorsqu'il traduit un seul fichier source C en code machine. La sortie contient des instructions machine, des segments de données initialisés et non initialisés, une table des symboles et des entrées de relocalisation, mais elle n'est pas encore exécutable : les références aux fonctions et variables définies dans d'autres unités de traduction sont laissées comme des emplacements non résolus pour l'éditeur de liens.
Le format binaire dépend de la plateforme cible :
- Sur Linux et la plupart des systèmes Unix/BSD, les fichiers
.outilisent le conteneur ELF (Executable and Linkable Format), reconnu par les octets magiques\x7FELFà l'offset 0 et une_typedeET_REL(relocatable, valeur0x0001). - Sur macOS, l'équivalent utilise le format Mach-O, commençant par
CF FA ED FE(64 bits little-endian). - Sur Windows, le fichier fonctionnellement identique est nommé avec l'extension .obj et utilise le format COFF.
Après la compilation, l'éditeur de liens (ld) combine un ou plusieurs fichiers .o avec des bibliothèques pour produire un exécutable ou une bibliothèque partagée. Plusieurs fichiers .o peuvent également être regroupés dans une archive statique à l'aide de la commande ar.
Les fichiers .o sont des artefacts de construction temporaires générés automatiquement par la chaîne d'outils et ne sont pas destinés à être ouverts par les utilisateurs finaux. Les développeurs qui ont besoin de les inspecter peuvent utiliser nm, objdump ou readelf pour examiner les symboles, les sections et le désassemblage.
Sécurité et sûreté
RISQUE : LOWUn .o est une donnée de temps de construction, pas quelque chose que le système d'exploitation lance, il présente donc peu de risques directs pour les utilisateurs finaux - vous ne pouvez pas double-cliquer dessus pour l'exécuter. Pour les développeurs, le souci est la confiance dans la chaîne d'approvisionnement : lier un objet provenant d'une source non fiable intègre son code machine directement dans votre programme, ne construisez donc qu'avec des objets/bibliothèques provenant de sources sûres. Les objets de votre propre arborescence de construction peuvent être supprimés sans danger ; ils se régénèrent à la prochaine compilation.
Détails du format
en brefProgrammes qui ouvrent les fichiers O
Détails techniques
spécifications approfondies| Format de conteneur | ELF sur Linux/Unix, Mach-O sur macOS, COFF sur Windows (où le fichier est généralement nommé `.obj`) |
| Encodage du fichier | Binaire (non lisible par l'homme) |
| Octets magiques ELF | `7F 45 4C 46` (`\x7FELF`) à l'offset 0 - présent dans tous les fichiers objets basés sur ELF |
| Champ de type d'objet ELF | `e_type = ET_REL` (0x0001) dans l'en-tête ELF - distingue un objet relocalisable d'un exécutable (`ET_EXEC`) ou d'une bibliothèque partagée (`ET_DYN`) |
| Type MIME | `application/x-object` ; également transporté comme `application/octet-stream` par les serveurs génériques |
| Ordre des octets | Encodé dans l'octet `EI_DATA` de l'en-tête ELF : little-endian (`ELFDATA2LSB`) sur x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) sur PowerPC/SPARC |
| Sections clés | `.text` (code exécutable), `.data` (globales initialisées), `.bss` (globales initialisées à zéro), `.rodata` (constantes en lecture seule) |
| Table des symboles | La section `.symtab` liste le nom de chaque symbole défini et référencé, sa liaison (locale/globale/faible), son type (fonction/objet) et sa valeur |
| Entrées de relocalisation | Les sections `.rel.text` / `.rela.text` enregistrent chaque emplacement d'adresse que l'éditeur de liens doit corriger lors de la fusion des fichiers objets dans un binaire final |
| Identification de l'architecture | Le champ `e_machine` dans l'en-tête ELF identifie le processeur cible : `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), etc. |
| Taille typique du fichier | De 1 Ko à plusieurs Mo par unité de traduction, selon la complexité de la source et le niveau d'optimisation du compilateur |
| Compression | Aucune - les fichiers objets sont stockés sous forme de données binaires brutes non compressées |
| Modèle de compilation un-pour-un | Exactement un fichier `.o` est émis par unité de traduction source (un par fichier `.c` ou `.cpp`) ; l'éditeur de liens les fusionne ensuite |
| Conditionnement en bibliothèque statique | Plusieurs fichiers `.o` sont archivés dans une bibliothèque statique `.a` à l'aide de `ar`, qui préserve chaque objet en tant que membre nommé |
| Résolution au moment du lien uniquement | Contrairement aux bibliothèques partagées `.so` / `.dylib`, toutes les références de symboles dans un `.o` sont entièrement résolues au moment de l'édition de liens, ne laissant aucune dépendance dynamique à l'exécution |
| Outils d'inspection | `nm` (liste les symboles), `objdump` (désassemblage et vidage de sections), `readelf` (détails de l'en-tête et des sections ELF), `otool` (équivalent Mach-O pour macOS) |
| Publié | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Dernière version | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Standard ouvert | Oui · libre de droits |
| Spécification | refspecs.linuxfoundation.org |
Conversions O
Q&R de la communauté
posées par les utilisateursPas encore de questions - soyez le premier à poser une question sur les fichiers O.