2012-08-07 15 views
16

Estoy tratando de comprender el proceso de compilación y enlace en C/C++. Sé que el compilador primero convierte los archivos fuente en archivos objeto. El vinculador generó bibliotecas o ejecutables a partir de los archivos objeto.¿Cómo se enumeran las funciones presentes en el archivo objeto?

Estoy tratando de leer primero la información en los archivos del objeto. Este es el programa que he escrito para la experimentación.

func.h

#include <iostream> 

void beautifulprint(char *str); 

func.cpp

#include "stdafx.h" 
#include "func.h" 

using namespace std; 

void beautifulprint(char *str) { 
    cout << "*** " << str << " ***" << endl; 
} 

TestApp.cpp

#include "stdafx.h" 
#include "func.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    beautifulprint("Hello, world!"); 

    return 0; 
} 

Después de construir el proyecto en VS 2010 llego func.obj. Supuse que en algún lugar de func.obj debería haber una referencia para la función beautifulprint. Ejecuté lo siguiente para las versiones de depuración y liberación de func.obj

dumpbin /HEADERS func.obj > funchead.txt 

A continuación se muestra la salida.

versión de depuración (potencia total de salida no incluida ya que es muy grande)

... 

SECTION HEADER #41 
    .text name 
     0 physical address 
     0 virtual address 
     78 size of raw data 
    5B94 file pointer to raw data (00005B94 to 00005C0B) 
    5C0C file pointer to relocation table 
     0 file pointer to line numbers 
     A number of relocations 
     0 number of line numbers 
60501020 flags 
     Code 
     COMDAT; sym= "void __cdecl beautifulprint(char *)" ([email protected]@[email protected]) 
     16 byte align 
     Execute Read 

SECTION HEADER #42 
.debug$S name 
     0 physical address 
     0 virtual address 
     E8 size of raw data 
    5C70 file pointer to raw data (00005C70 to 00005D57) 
    5D58 file pointer to relocation table 
     0 file pointer to line numbers 
     7 number of relocations 
     0 number of line numbers 
42101040 flags 
     Initialized Data 
     COMDAT (no symbol) 
     Discardable 
     1 byte align 
     Read Only 

... 

versión Release (salida completa!)

Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file func.obj 

File Type: ANONYMOUS OBJECT 

ANON OBJECT HEADER VALUES 
       1 version 
      14C machine (x86) 
     50213733 time date stamp Tue Aug 07 16:41:39 2012 
       ClassID: {0CB3FE38-D9A5-4DAB-AC9B-D6B6222653C2} 
      2D1 size 
       0 flags 

Y aquí están mis preguntas. Como era de esperar, la versión de Debug de func.obj tiene una referencia a beautifulprint. Pero para mi asombro, ¿no hay referencia a beautifulprint en la versión de lanzamiento? ¿Cómo sabría el vinculador que esta función está presente en el archivo objeto?

¿Por qué la versión del debug obj tiene funciones de iostream? ¿No deberían estar presentes en alguna biblioteca estándar en lugar de este obj?

Editar: He abierto directamente la versión func.obj en VS 2010 en formato hexadecimal. Busqué beautifulprint y está presente en la columna de la derecha (ASCII). Significa que la referencia está presente. ¿Por qué Dumpbin no lo muestra? Necesito alguna herramienta para verla en formato legible para humanos.

Respuesta

16

Vuelque los símbolos en su lugar. Todos los archivos .obj tienen una tabla de símbolos. Le mostrará aquellos símbolos definidos internamente, y aquellos que necesitan resolución. Los símbolos IO que ve pueden ser símbolos UNDEF, pero la tabla de símbolos debería dejarlo más claro.

DUMPBIN /SYMBOLS func.obj 

Tenga en cuenta que/símbolos no están disponibles cuando el objeto se compila con/GL (whole program optimization). Los módulos de objetos creados con/GL (así como las bibliotecas) se crean con un formato que no se garantiza que sea compatible de una versión de compilador a la siguiente.

La optimización de todo el programa significa que el optimizador puede optimizar en todos los módulos, en lugar de solo dentro de cada módulo. Las funciones pueden convertirse en "en línea" y otros trucos realizados que presumiblemente no son muy compatibles con COFF. Se recomienda que las bibliotecas entregadas no tengan la opción/GL establecida a menos que esté suministrando bibliotecas para todas las versiones de compilador admitidas.

+0

Lo intenté ya.El resultado es simplemente: "Volcado de archivo func.obj Tipo de archivo: OBJETO ANÓNIMO" – Cracker

+1

¿Está utilizando la opción/GL compilador? – Les

+0

Umm ... no estoy seguro. Estoy construyendo con opciones predeterminadas. – Cracker

Cuestiones relacionadas