Introduction
L'extension de fichier «.OBJ» permet d'indiquer le résultat d'un code compiler avant d'effectuer des liaisons pour en faire un programme exécutable. Il est utilisé par nombreux compilateurs C et C++ concurrent d'Intel, comme ceux de Borland. Le format de fichier .OBJ constitue l'un des formats de fichiers objets les plus répandus dans l'univers des compilateurs destinés à l'architecture Intel 80x86. Il représente le résultat intermédiaire produit après la compilation d'un ou de plusieurs fichiers sources, mais avant l'étape de l'édition de liens (linking) qui permettra de générer un programme exécutable ou une bibliothèque. Un fichier objet contient généralement le code machine, les données, les tables de symboles ainsi que les informations de relocalisation nécessaires au fabricant de liens pour assembler correctement les différents modules d'une application.
Au fil des années, ce format a été adopté par de nombreux compilateurs et environnements de développement, notamment ceux de Borland, Microsoft, Intel, Digital Research et plusieurs autres fabricants de compilateurs compatibles avec l'architecture x86. Bien que certains compilateurs utilisent aujourd'hui le format COFF ou d'autres variantes plus modernes, le format OBJ historique demeure largement documenté et reste indispensable pour l'étude des anciens compilateurs, des systèmes DOS, des outils de rétro-ingénierie et des logiciels de développement classiques.
La section suivante présente les principales caractéristiques techniques de ce format, notamment son auteur, les plateformes concernées, les logiciels compatibles ainsi que les différents types d'enregistrements qui composent sa structure interne. Ces informations permettent de mieux comprendre l'organisation des fichiers OBJ et facilitent le développement d'utilitaires capables de les analyser, de les modifier ou de les convertir.
Spécification
| Spécification | Description |
|---|---|
| Type | Compilateur |
| Auteur | Intel |
| Supporté par les applications | Intel C++, Borland C++, Microsoft Pascal, Pascal-86, Turbo C, Turbo C++,... |
| Plateforme | Assembleur 80x86 |
Structure du fichier
Le format OBJ est constitué d'une suite d'enregistrements binaires décrivant les différents éléments produits lors de la compilation. Chaque enregistrement débute par un identifiant permettant au fabricant de liens ou à un utilitaire d'analyse de déterminer sa nature et la manière dont son contenu doit être interprété. Selon les besoins du compilateur, certains enregistrements peuvent apparaître plusieurs fois tandis que d'autres sont facultatifs ou réservés à des usages particuliers. Voici les balises que contiennent les fichiers objet (.OBJ) qu'utilise les compilateurs de famille INTEL:
| Balises | MID | Description |
|---|---|---|
| 6Eh | RHEADR | Cette balise indique l'enregistrement d'entête d'un R-Module |
| 70h | REGINT | Cette balise indique l'enregistrement d'initialisation de registre |
| 72h | REDATA | Cette balise indique l'enregistrement des données d'énumération relogeable |
| 74h | RIDATA | Cette balise indique l'enregistrement des données réitéré relogeable |
| 76h | OVLDEF | Cette balise indique l'enregistrement de définition de recouvrement |
| 78h | ENDREC | Cette balise indique la fin d'un enregistrement |
| 7Ah | BLKREC | Cette balise indique l'enregistrement d'un bloc de définition |
| 7Ch | BKLEND | Cette balise indique la fin d'un enregistrement de bloc |
| 7Eh | DEBSYM | Cette balise indique l'enregistrement de symbole de déboguage |
| 80h | THEADR | Cette balise indique l'enregistrement d'entête d'un T-Module |
| 82h | LHEADR | Cette balise indique l'enregistrement d'entête d'un L-Module |
| 84h | PEDATA | Cette balise indique une énumération de données physique |
| 86h | PIDATA | Cette balise indique une réitéré de données physique |
| 88h | COMENT | Cette balise indique l'enregistrement de commentaire |
| 8Ah | MODEND | Cette balise indique la fin d'un module d'enregistrement |
| 8Bh | MODENDL | Cette balise indique la fin d'un module d'enregistrement |
| 8Ch | MODENDL | Cette balise indique l'enregistrement de définition de nom externe de format long |
| 8Eh | TYPDEF | Cette balise indique l'enregistrement de définition de type |
| 90h | PUBDEF | Cette balise indique l'enregistrement de définition de nom publique |
| 91h | PUBDEFL | Cette balise indique l'enregistrement de définition de nom publique de format long |
| 92h | LOCSYM | Cette balise indique l'enregistrement de symboles local |
| 94h | LINNUM | Cette balise indique l'enregistrement des numéros de ligne |
| 96h | LNAMES | Cette balise indique l'enregistrement de liste des noms |
| 98h | SEGDEF | Cette balise indique l'enregistrement de définition de segment |
| 99h | SEGDEFL | Cette balise indique l'enregistrement de définition de segment long |
| 9Ah | GRPDEF | Cette balise indique l'enregistrement de définition de groupe |
| 9Ch | FIXUPP | Cette balise indique l'enregistrement de Fix-Up. |
| 9Dh | FIXUPP | Cette balise indique l'enregistrement de Fix-Up long. |
| A0h | LEDATA | Cette balise indique l'énumération de données logique. |
| A1h | LEDATAL | Cette balise indique l'énumération de données logique long. |
| A2h | LIDATA | Cette balise indique la réitéré de données logique. |
| A3h | LIDATAL | Cette balise indique la réitéré de données logique long. |
| A4h | LIBHED | Cette balise indique l'enregistrement d'entête de bibliothèque. |
| A6h | LIBNAM | Cette balise indique l'enregistrement des noms de module de bibliothèque. |
| A8h | LIBLOC | Cette balise indique l'enregistrement des emplacements de module de bibliothèque. |
| AAh | LIBDIC | Cette balise indique l'enregistrement du dictionnaire de bibliothèque. |
| B0h | COMDEF | Cette balise indique l'enregistrement du définitions de données commune. |
| B4h | LEXTDEF | Cette balise indique un définition local externe. |
| B6h | LPUBDEF | Cette balise indique un définition local publique. |
| B7h | LPUBDF2 | Cette balise indique un définition local publique (2ième niveau). |
| B8h | LCOMDEF | Cette balise indique un définition de données local commune. |
| F0h | LIBHDR | Cette balise indique un enregistrement d'entête de bibliothèque. |
| F1h | LIBEND | Cette balise indique une fin d'enregistrement de bibliothèque. |
Code source
Plusieurs utilitaires ont été développés afin de permettre l'analyse, l'affichage ou la manipulation des fichiers d'extension «.OBJ». Ces programmes facilitent l'étude de la structure interne du format, le débogage d'outils de développement ou encore la création de fabricants de liens et d'utilitaires spécialisés. Le tableau suivant présente quelques exemples de programmes capables de lire ou de traiter ce type de fichier.
Voici des exemples de code source d'utilitaires pour manipuler les .OBJ :
| Lien | Langage de programmation | Description | Projet | Syntaxe |
|---|---|---|---|---|
| DISOBJ.PAS | Free Pascal, Turbo Pascal | Cette commande permet d'analyser et de désassembler un fichier d'extension «.OBJ». | DEV-COOLS | DISOBJ |
| LINK.PAS | Free Pascal, Turbo Pascal | Cette commande permet de lancer le fabricant de liaison. | DEV-COOLS | LINK |