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.
tiene sentido, muchas gracias. Buscaré "bibliotecas compartidas" también. ¿Tienes algún libro que puedas recomendar para aprender más sobre esto? –
El mejor libro que conozco sobre el tema es [_Linkers and Loaders_ by John R. Levine] (http://rads.stackoverflow.com/amzn/click/1558604960). – alanc