Pregunta

Siempre he estado confundido acerca de cómo funciona el enlazador, y es un tema difícil de buscar.

Para demostrar mi pregunta y proporcionar un marco para una respuesta, anotaré lo que sé (o creo que sé) hasta ahora. Puedo estar muy equivocado. :)

Primero, cada archivo .cpp está integrado en un archivo intermedio (.o para Posix / ELF y .obj para Win / PE, creo). Este archivo intermedio contiene todos los símbolos definidos por el archivo .cpp a partir del cual se creó y tiene instrucciones sobre qué enlaces externos debe resolverse correctamente. Como una extensión de esto, los sistemas Posix le permiten combinar los archivos .o en un archivo .a (¿Qué parece no hacer nada más que combinar? ¿Qué comando hace esto?). ¿Es .lib el equivalente Win / PE del archivo Posix .a?

Luego, los archivos intermedios se vinculan entre sí, se resuelven las dependencias externas y usted tiene su ejecutable. ¿Me faltan algunos pasos?

¡Gracias!

¿Fue útil?

Solución

Aquí hay algunas piezas del rompecabezas:

  • ar (1) se usa para crear archivos .a. Son similares a los archivos tar (1) o zip (posiblemente con un índice para buscar un archivo de objeto por nombre de símbolo)
  • El vinculador copia juntas las secciones de los archivos de objetos (texto, datos, bss). Para GNU ld, la copia precisa de las secciones se puede controlar con un script vinculador (por ejemplo, copie todas las secciones de archivos .o que contengan '' texto '' en sus nombres en una sola sección de texto)
  • El enlazador también realiza reubicaciones: instrucciones de parcheo (salto y carga de datos) con las respectivas direcciones de destino, una vez que se conoce el valor de un símbolo. En algunos casos, esto no se puede hacer en el momento del enlace, por lo que el vinculador copia / ajusta los registros de reubicación de los archivos .o en el ejecutable final.
  • Windows .lib tiene dos propósitos: una biblioteca estática (.lib) es similar a las bibliotecas .a. Una biblioteca de importación (.lib) no contiene el código real, sino solo listas de símbolos. El vinculador puede resolver símbolos de la biblioteca de importación, pero luego sabe que necesita poner una referencia al .dll correspondiente en el ejecutable. En Unix / ELF, el archivo .so tiene tanto el código como la tabla de símbolos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top