2010-06-15 22 views
42

Durante las diversas etapas de compilación en C o C++, sé que se genera un archivo de objeto (es decir, cualquier archivo any_name.o). ¿Qué contiene este archivo .o? No puedo abrirlo ya que es un archivo binario.¿Qué contiene un archivo objeto?

¿Alguien podría ayudarme? ¿El contenido del archivo objeto depende principalmente del compilador que usamos en Unix?

+1

Hay un montón de herramientas * nix para buscar dentro de un archivo de objeto: comience con nm, http://unixhelp.ed.ac.uk/CGI/man-cgi?nm –

Respuesta

45

archivos de objetos pueden contener un montón de cosas: Básicamente se trata de parte o la totalidad de la siguiente lista:

  • Symbol Nombres
  • El código compilado
  • de datos constante, por ejemplo.cadenas
  • Importaciones: símbolos a los que hace referencia el código compilado (se arregla por el vinculador)
  • Exportaciones: los símbolos que el archivo objeto pone a disposición de OTROS archivos de objetos.

El enlazador convierte un conjunto de archivos de objetos en un archivo ejecutable, haciendo coincidir todas las importaciones y exportaciones, y modificando el código compilado para que se llamen las funciones correctas.

3

Utilice el comando de archivo para cosas como esta. Es un archivo de objeto ELF en un sistema Linux moderno. P.ej. si compilado para 32-bit x86.

ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

el contrario, un ejecutable enlazado dinámicamente podría ser:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 

Para ver cabecera, incluidos los nombres de sección, puede utilizar:

objdump -x any_name.o 

Para desmontar:

objdump -d any_name.o 
3

El objeto archivo es la fuente compilada.

Esto significa que es un código de máquina, que depende de la plataforma de destino (puede compilar para Unix en Windows si realmente lo desea) y el compilador utilizado. Diferentes compiladores producirán diferentes códigos de máquina del mismo archivo fuente.

5

Primero lea el wiki page. Puede utilizar objdump para examinar un archivo de este tipo :)

1

El archivo contiene datos binarios que se debe ejecutar a través de un linker para generar un archivo ejecutable. Es esencialmente un conjunto de instrucciones de código de máquina con secciones con nombre (correspondientes a sus funciones). De Object File '' artículo de Wikipedia:

En informática, un archivo objeto es una colección organizada de , secuencias nombradas separadas de código de máquina [cita requerida]. Cada secuencia, o un objeto, típicamente contiene instrucciones para la máquina host a lograr alguna tarea, posiblemente acompañada de datos relacionados y metadatos (por ejemplo, información de la relocalización , pila desenrollar información, comentarios, programa símbolos, depuración o perfilado información). Un enlazador suele ser utilizado para generar una biblioteca ejecutable o combinando partes de los archivos del objeto .

7

Existen varios formatos estandarizados (COFF, ELF en Unix), básicamente son variantes de los mismos formatos que los utilizados para ejecutables pero faltan algunas informaciones. Estas informaciones faltantes se completarán cuando se enlace.

Objetos formatos de archivos contiene básicamente las mismas informaciones:

  • código binario resultante de la compilación (por un procesador de objetivo)
  • datos estáticos utilizados por esa parte del programa (como cadenas constantes, etc). Puede hacer una distinción más fina entre BSS (datos exportados) y Texto (datos que no serán modificados por el programa). Pero eso es más importante para el compilador y el enlazador. Tenga en cuenta que, al igual que el código binario, los datos también dependen del objetivo (big-endian, little-endian, 32bits, 64bits).
  • tablas de símbolos exportados por esta parte del programa (en su mayoría funciones puntos de entrada)
  • tablas de símbolos externos utilizados por esta parte del programa

Cuando los objetos se pueden unir las partes del código eso se refiere a que los símbolos externos serán reemplazados por valores reales (bueno, eso todavía está simplificado, hay una última parte que se hará en el momento de cargar cuando se ejecuta el programa, pero esa es la idea).

El archivo de objeto también puede contener más información de símbolos estrictamente necesaria para resolver importaciones y exportaciones (útil para la depuración). Esa información puede eliminarse usando el comando strip.

1

En el entorno de compilación GNU puede buscar objdump tanto en el archivo ejecutable como en el objeto.

Como puede ver, el objeto contiene solo el código de funciones declaradas/referenciadas dentro del archivo compilado (el archivo contiene solo la función principal con una llamada scanf y una llamada printf).

$ objdump -t scanf_sample.o 

scanf_sample.o:  file format pe-i386 

SYMBOL TABLE: 
[ 0](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 1) 0x00000000 scanf_sample.c 
File 
[ 2](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _main 
[ 3](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text 
AUX scnlen 0x91 nreloc 9 nlnno 0 
[ 5](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .data 
AUX scnlen 0x0 nreloc 0 nlnno 0 
[ 7](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss 
AUX scnlen 0x0 nreloc 0 nlnno 0 
[ 9](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata 
AUX scnlen 0x54 nreloc 0 nlnno 0 
[ 11](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000000 ___main 
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0 
[ 13](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __alloca 
[ 14](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _memset 
[ 15](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _scanf 
[ 16](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _printf 

Si utiliza objdump en un archivo ejecutable se puede ver mucho más funciones (además de los que se encuentran dentro del objeto). Esto demuestra que el archivo objeto contiene solo las funciones definidas en el archivo fuente con referencias a otras funciones. Esas referencias se resolverán en la fase de enlace.

Más información acerca de linking, compilation y objects.

+0

Utilicé MinGW en Windows para el muestra arriba - funciona igual bajo * nix – INS

3

En primer lugar, los archivos binarios pueden abrirse! No tengas miedo, ¡solo necesitas las herramientas adecuadas! Al ser datos binarios, un editor de texto no es la herramienta adecuada, por supuesto; una herramienta adecuada podría ser un editor hexadecimal, o un editor avanzado como emacs, o una herramienta que en lugar de simplemente "dar salida" a bytes en su representación "hexadecimal" y dejarlo solo con su interpretación de los datos, conoce ese formato particular y " interpreta "los datos correctamente, en algún nivel (por ejemplo,GIMP interpreta un archivo PNG como una imagen y lo muestra; un analizador PNG "descompondrá" los datos dentro de las secciones PNG que muestran las banderas indicadas en ciertos bytes, ... etc.).

En su caso, la respuesta general es que el archivo de objeto contiene su código compilado (y datos), además de toda la información adicional que necesita el vinculador y, finalmente, más.

Cómo estas informaciones están "organizadas" y en algunos casos en qué consiste el "eventualmente más", depende del formato del objeto específico. Algunos enlaces de wikipedia el listado algunas de las posibilidades son this, this, this, this ...

Cada uno de estos puede tener sus herramientas para analizar el contenido; p.ej. readelf para ELF, objdump para varios formatos (intente objdump -i) dependiendo de cómo se haya compilado.

Cuestiones relacionadas