Se dice que el cargador de Linux es / usr / bin / ld, pero usualmente usamos gcc / g ++ para vincular bibliotecas y ejecutables, apenas usamos "ld".

La última vez que usé "ld" manualmente fue cuando estaba aprendiendo el ensamblaje de Linux, la única forma de generar ejecutables es ld un archivo .o para generar ejecutables directamente sin ninguna biblioteca.

Mi pregunta es, ¿gcc / g ++ contiene algunos contenedores de funciones de "ld", porque "ld" sin formato es demasiado difícil de usar? ¿O nunca deberíamos usar "ld" explícitamente para la vinculación del programa c / c ++, debido a blablabla?

Muchas gracias.

6
Troskyvs 29 dic. 2016 a las 04:47

3 respuestas

La mejor respuesta

Gcc proporciona algunas opciones predeterminadas para ld.

ld no sabe nada sobre C ++ o cualquier otro lenguaje. ld no tiene idea de con qué bibliotecas necesita vincular su código. Si intenta vincular su código C ++ compilado con ld directamente, se rescatará, ya que ld, por sí mismo, no tiene idea de dónde puede encontrar libstdc++, la biblioteca de tiempo de ejecución C ++ de gcc. ¿Usas cuerdas? vectores? La mayor parte de eso es código de plantilla que se compila como parte de su módulo de objeto. Pero todavía hay algunos bits precompilados, en libstdc++, que deben vincularse.

Cuando le da su código compilado a gcc para que se vincule, gcc será lo suficientemente cortés como para pasar todos sus archivos a ld y le dirá a ld qué bibliotecas, además de las que especifique explícitamente.

Puede vincular con ld directamente, si lo desea, siempre que especifique las mismas bibliotecas y la opción de enlace que utiliza gcc. ¿Pero por qué querrías hacer eso? Simplemente use gcc para vincular su código compilado con gcc.

8
Sam Varshavchik 29 dic. 2016 a las 01:53

No debe intentar utilizar directamente ld para vincular un programa C ++ porque necesita conocer los detalles de implementación de dónde se encuentra la parte estática de la biblioteca de tiempo de ejecución de C ++. g++ conoce estos detalles de implementación, como dónde encontrar el archivo libstdc++.a. Si intentara utilizar ld directamente, tendría que suministrar todas estas bibliotecas estáticas "faltantes".

3
Brian 29 dic. 2016 a las 01:55

Mi pregunta es si gcc / g ++ contiene algunos contenedores de funciones de "ld"

Así es.

porque "ld" sin formato es demasiado difícil de usar?

Bueno en realidad no; puede usarlo usted mismo sin demasiado muchos problemas, pero es conveniente administrar todo el proceso de compilación a través de un solo ejecutable, con un único conjunto de indicadores y, a menudo, con un solo comando.

También es probable que tenga que proporcionar rutas absolutas a algunas bibliotecas de tiempo de ejecución (por ejemplo, libstdc ++. A) usted mismo si omitió el contenedor (aunque no he probado esto).

¿O nunca deberíamos usar "ld" explícitamente para la vinculación del programa c / c ++, debido a blablabla?

Eres libre de hacerlo si quieres. La única razón por la que las personas pueden levantar las cejas es preguntando por qué no lo estás haciendo de la manera convencional. Si tiene una buena razón para invocar ld directamente, en lugar de pasar por g++ y pasar por cualquier indicador de enlace de esa manera, ¡siga adelante!

2
Lightness Races in Orbit 29 dic. 2016 a las 01:54