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.
Lo intenté ya.El resultado es simplemente: "Volcado de archivo func.obj Tipo de archivo: OBJETO ANÓNIMO" – Cracker
¿Está utilizando la opción/GL compilador? – Les
Umm ... no estoy seguro. Estoy construyendo con opciones predeterminadas. – Cracker