2009-07-24 13 views

Respuesta

5

Bueno, ahora que mencionas el nm de Unix, puedo señalar la resolución del símbolo.

Los archivos ejecutables pueden hacer referencia a entidades que no están definidas dentro de sí mismas. Por ejemplo, variables o procedimientos en bibliotecas compartidas. Esas entidades están identificadas por símbolos externos. El ejecutable también podría tener símbolos internos a los que se pueda hacer referencia mediante archivos externos, como es el caso, por supuesto, de las bibliotecas.

La resolución de símbolo, en este contexto, es, una vez que un programa se ha cargado en la memoria, asignar direcciones adecuadas a todas las entidades externas a las que hace referencia. Esto significa cambiar cada posición en el programa cargado donde se hizo una referencia a un símbolo externo.

Estas direcciones dependerán de dónde, en la memoria, se haya cargado el código con los símbolos externos.

En Unix, el modo de compilación predeterminado para los programas es utilizar la biblioteca compartida de sistemas, en lugar de vincular previamente todo lo necesario en el ejecutable. Al compilar un programa con gcc, por ejemplo, pasa el indicador -static si desea que se compile estáticamente, en lugar de tener referencias simbólicas sin resolver.

Busque "bibliotecas compartidas" para obtener más información.

+0

tiene sentido, muchas gracias. Buscaré "bibliotecas compartidas" también. ¿Tienes algún libro que puedas recomendar para aprender más sobre esto? –

+1

El mejor libro que conozco sobre el tema es [_Linkers and Loaders_ by John R. Levine] (http://rads.stackoverflow.com/amzn/click/1558604960). – alanc

1

No estoy seguro de qué contexto significa la resolución de símbolos. Pero me recuerda a dlopen (3) y dlsym (3) para la resolución de símbolos en tiempo de ejecución en bibliotecas compartidas.

+0

Lo digo en el contexto de usarlo con el comando nm en Unix. ¿Eso ayuda? No estoy seguro de qué dlopen sea tampoco, así que no puedo decir si estás cerca. –

1

Como se mencionó, puede referirse a tiempo de ejecución o resolución de símbolo de tiempo de enlace. Sin embargo, no debe olvidar resolución de símbolo de tiempo de compilación.

Estas son las reglas que usa un lenguaje para asignar símbolos a "cosas". Los símbolos son casi todo lo que se parece a un nombre (local, miembros y variables globales, funciones, métodos, tipos, etc.) y "cosas" son los compiladores que entienden a qué se refiere el nombre.

Las reglas para hacer esto pueden ser bastante simples (por ejemplo, IIRC en C es poco más que una lista ordenada de lugares para buscar) o complejas (C++ tiene todo tipo de casos con sobrecarga, plantillas y demás). En general, estas reglas interactúan con la semántica del programa y, a veces incluso pueden resultar en (potencialmente) ambigüedades:

C++:

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed? 
Cuestiones relacionadas