¿Qué es el formato de archivo O?
Un archivo .o es un archivo de objeto compilado: un binario intermedio producido por un compilador como GCC o Clang cuando traduce un único archivo fuente C a código máquina. La salida contiene instrucciones de máquina, segmentos de datos inicializados y no inicializados, una tabla de símbolos y entradas de reubicación, pero aún no es ejecutable: las referencias a funciones y variables definidas en otras unidades de traducción se dejan como marcadores de posición sin resolver para el enlazador.
El formato binario depende de la plataforma de destino:
- En Linux y la mayoría de los sistemas Unix/BSD, los archivos
.outilizan el contenedor ELF (Executable and Linkable Format), reconocido por los magic bytes\x7FELFen el desplazamiento de byte 0 y une_typedeET_REL(reubicable, valor0x0001). - En macOS, el equivalente utiliza el formato Mach-O, que comienza con
CF FA ED FE(64 bits little-endian). - En Windows, el archivo funcionalmente idéntico se nombra con la extensión .obj y utiliza el formato COFF.
Después de la compilación, el enlazador (ld) combina uno o más archivos .o con bibliotecas para producir un ejecutable o una biblioteca compartida. También se pueden agrupar varios archivos .o en un archivo estático utilizando el comando ar.
Los archivos .o son artefactos de construcción temporales generados automáticamente por la cadena de herramientas y no están destinados a ser abiertos por usuarios finales. Los desarrolladores que necesiten inspeccionarlos pueden usar nm, objdump o readelf para examinar símbolos, secciones y desensamblado.
Seguridad y protección
RIESGO: LOWUn .o son datos de tiempo de construcción, no algo que el sistema operativo ejecute, por lo que representa poco riesgo directo para los usuarios finales; no se puede hacer doble clic y ejecutarlo. Para los desarrolladores, la preocupación es la confianza en la cadena de suministro: enlazar un objeto de una fuente no confiable integra su código máquina directamente en su programa, por lo que solo debe construir con objetos/bibliotecas de fuentes en las que confíe. Los objetos en su propio árbol de construcción son seguros de eliminar; se regeneran en la siguiente compilación.
Detalles del formato
en pocas palabrasProgramas que abren archivos O
Detalles técnicos
especificación profunda| Formato de contenedor | ELF en Linux/Unix, Mach-O en macOS, COFF en Windows (donde el archivo suele llamarse `.obj`) |
| Codificación de archivo | Binario (no es texto legible por humanos) |
| Magic bytes ELF | `7F 45 4C 46` (`\x7FELF`) en el desplazamiento de byte 0 - presente en todos los archivos de objeto basados en ELF |
| Campo de tipo de objeto ELF | `e_type = ET_REL` (0x0001) en la cabecera ELF - distingue un objeto reubicable de un ejecutable (`ET_EXEC`) o biblioteca compartida (`ET_DYN`) |
| Tipo MIME | `application/x-object`; también se transporta como `application/octet-stream` por servidores genéricos |
| Orden de bytes (Endianness) | Codificado en el byte `EI_DATA` de la cabecera ELF: little-endian (`ELFDATA2LSB`) en x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) en PowerPC/SPARC |
| Secciones clave | `.text` (código ejecutable), `.data` (globales inicializadas), `.bss` (globales inicializadas a cero), `.rodata` (constantes de solo lectura) |
| Tabla de símbolos | La sección `.symtab` enumera el nombre de cada símbolo definido y referenciado, su vinculación (local/global/débil), tipo (función/objeto) y valor |
| Entradas de reubicación | Las secciones `.rel.text` / `.rela.text` registran cada ranura de dirección que el enlazador debe parchear al fusionar archivos de objeto en un binario final |
| Identificación de arquitectura | El campo `e_machine` en la cabecera ELF identifica el objetivo de CPU: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), etc. |
| Tamaño de archivo típico | De 1 KB a varios MB por unidad de traducción, dependiendo de la complejidad del código fuente y el nivel de optimización del compilador |
| Compresión | Ninguna - los archivos de objeto se almacenan como datos binarios brutos sin comprimir |
| Modelo de compilación uno a uno | Se emite exactamente un archivo `.o` por unidad de traducción de código fuente (uno por cada archivo `.c` o `.cpp`); el enlazador los fusiona posteriormente |
| Empaquetado de biblioteca estática | Múltiples archivos `.o` se archivan en una biblioteca estática `.a` usando `ar`, que conserva cada objeto como un miembro con nombre |
| Resolución solo en tiempo de enlace | A diferencia de las bibliotecas compartidas `.so` / `.dylib`, todas las referencias a símbolos en un `.o` se resuelven por completo en el momento del enlazado, sin dejar dependencias dinámicas en tiempo de ejecución |
| Herramientas de inspección | `nm` (listar símbolos), `objdump` (desensamblado y volcado de secciones), `readelf` (detalles de cabecera y secciones ELF), `otool` (equivalente de Mach-O en macOS) |
| Lanzado | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Última versión | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Estándar abierto | Sí · libre de regalías |
| Especificación | refspecs.linuxfoundation.org |
Conversiones de O
Preguntas y respuestas de la comunidad
preguntado por usuariosAún no hay preguntas; sea el primero en preguntar sobre los archivos O.