Tipus | Binari, executable, odi objecte, biblioteques compartides |
---|---|
Extensió | none, .o, .so, .out |
MIME | application/x-coff i application/x-coffexec |
Magic number | 4C 01 per i386
64 86 per AMD64 00 02 per Itanium[2] |
Desenvolupador | AT&T |
Més informació | |
Stack Exchange | Etiqueta |
El Common Object File Format (COFF) és un format per a fitxers d'ordinador executables, codi d'objecte i biblioteques compartides utilitzats en sistemes Unix. Va ser introduït a Unix System V, va substituir el format a.out utilitzat anteriorment i va formar la base per a especificacions ampliades com XCOFF i ECOFF, abans de ser substituït en gran part per ELF, introduït amb SVR4. COFF i les seves variants es continuen utilitzant en alguns sistemes semblants a Unix, a Microsoft Windows (Portable Executable), en entorns UEFI i en alguns sistemes de desenvolupament integrats.[1]
El format original de fitxer d'objectes Unix a.out no és compatible amb les biblioteques compartides, la identificació de format estranger, o enllaç explícit d'adreces. A mesura que el desenvolupament de sistemes semblants a Unix va continuar tant dins com fora d'AT&T, van sorgir diferents solucions a aquests i altres problemes.[2]
COFF es va introduir l'any 1983 al sistema UNIX V d'AT&T per a plataformes de 32 bits no VAX, com ara el 3B20. Les millores respecte al format actual d'AT&T a.out incloïen seccions arbitràries, declaracions explícites del processador i enllaços d'adreces explícits.No obstant això, el disseny COFF era massa limitat i incompletament especificat: hi havia un límit en el nombre màxim de seccions, un límit en la longitud dels noms de les seccions, els fitxers font inclosos i la informació de depuració simbòlica era incapaç de suportar llenguatges del món real com ara com C, molt menys llenguatges més nous com C++, o processadors nous. Totes les implementacions del món real de COFF eren necessàriament violacions de l'estàndard com a resultat. Això va provocar nombroses extensions de COFF. IBM va utilitzar el format XCOFF a AIX; DEC, SGI i altres utilitzaven ECOFF; i nombrosos ports SysV i cadenes d'eines orientats al desenvolupament integrat, cadascun van crear les seves pròpies variacions incompatibles.[3]
La millora principal de COFF respecte a a.out va ser la introducció de múltiples seccions amb nom al fitxer objecte. Els diferents fitxers d'objectes poden tenir diferents números i tipus de seccions.[4]
La informació de depuració simbòlica COFF consisteix en noms simbòlics (cadena) per a funcions i variables del programa, i informació sobre el número de línia, utilitzats per establir punts d'interrupció i execució de traça.
Els noms simbòlics s'emmagatzemen a la taula de símbols COFF. Cada entrada de la taula de símbols inclou un nom, classe d'emmagatzematge, tipus, valor i número de secció. Els noms curts (8 caràcters o menys) s'emmagatzemen directament a la taula de símbols; els noms més llargs s'emmagatzemen com a compensació a la taula de cadenes al final de l'objecte COFF.
Quan es genera un fitxer COFF, normalment no se sap on es carregarà a la memòria. L'adreça virtual on es carregarà el primer byte del fitxer s'anomena adreça base d'imatge. La resta del fitxer no es carrega necessàriament en un bloc contigu, sinó en seccions diferents.
Les adreces virtuals relatives (RVA) no s'han de confondre amb les adreces virtuals estàndard. Una adreça virtual relativa és l'adreça virtual d'un objecte del fitxer un cop carregat a la memòria, menys l'adreça base de la imatge del fitxer. Si el fitxer s'hagués de mapejar literalment del disc a la memòria, el RVA seria el mateix que el desplaçament al fitxer, però això és força inusual.