2010-02-11 16 views
6

No necesito mucha aclaración en esta área. Siento que los términos Static library & Dynamic Library no son correctos.Biblioteca estática y Biblioteca dinámica: Confusión

  • lib1.o + lib2.o + lib3.o -> "LinkerOutputFile" (ejecutable o biblioteca).
  • Si este "LinkerOutputFile" contiene el código de todos los archivos lib1.o, lib2.o, lib3.o, entonces se dice que "LinkerOutputFile" está enlazado satíricamente "LinkerOutputFile" (ejecutable o biblioteca). (O)

  • Si "LinkerOutputFile" solo contiene referencias & otra información sobre a lib1.o, lib2.o, lib3.o sin que contiene el código de estos archivos lib * .o. Entonces se dice que "LinkerOutputFile" Dinámicamente vinculado.

¿Cómo hace esto que los archivos de lib * .o sean una biblioteca estática o una biblioteca dinámica? Son solo archivos de biblioteca.

O es que, "LinkerOutputFile" es una biblioteca en lugar de ejecutable, dependiendo de si su biblioteca estática o dinámicamente enlazada se llama biblioteca estática o biblioteca dinámica. ¿Verdadero o falso?

sé que estoy equivocado, porque, sé que

En la mayoría de las plataformas de tipo UNIX las extensiones son

  • .a para las bibliotecas estáticas (archivos) y
  • .so para bibliotecas compartidas.

En Windows:

  • .dll indica una biblioteca compartida
  • .lib indica una biblioteca estática o de importación.

Pero no puedo averiguar dónde estoy equivocado. También por favor dígame cómo son Static library & Dynamic Library internamente diferente.

Además, se trata de la especificación ABI:

En este capítulo se describe el objeto de formato de archivo , llamado ELF (Ejecutable y Vinculación Formato). Hay tres tipos principales de archivos de objeto .

Un archivo reubicable sostiene código y los datos adecuado para la vinculación con otro objeto archivos para crear un archivo de un objeto compartido ejecutable o.

Un archivo ejecutable tiene un programa adecuado para la ejecución; el archivo especifica cómo exec (BA_OS) crea una imagen de proceso del programa .

Un fichero objeto compartido sostiene código y de datos adecuado para vincular en dos contextos . Primero, el editor de enlaces [ver ld (BA_OS)] procesa el archivo de objetos compartidos con otros archivos de objetos reubicables y compartidos para crear otro archivo de objetos . En segundo lugar, el enlazador dinámico lo combina con un archivo ejecutable y otros objetos compartidos para crear una imagen de proceso .

"archivo de objeto compartido" son otras palabras para decir Dynamic Library (tiene extensión * .so). Pero ¿qué pasa con "Biblioteca estática"? Esto ni siquiera lo menciona.

¿Hay alguna diferencia entre, "Relocalizable" & "Static Library" & "Import Library"? Por favor, aclararme con la estructura interna.

+0

Tenga en cuenta que los archivos '.o' para enlaces estáticos y dinámicos difieren (vea la referencia gcc para la opción' -static'). La respuesta a su pregunta está aquí: http://stackoverflow.com/questions/1210787/relation-between-object-file-and-shared-object-file/1210857#1210857 –

+0

posible duplicado de [Diferencia entre bibliotecas estáticas y compartidas ?] (http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries) –

Respuesta

0

Digamos que tengo a mi App que enlaza con StaticLib.lib, a continuación, todo el código de la aplicación tanto mi y StaticLib.lib estarán en el mismo ejecutable. Esto significa que StaticLib.h contiene la implementación de funciones en él.

Ahora bien, si me enlace App con DynamicLib.lib, entonces mi App utilizará funciones implementadas en DynamicLib.dll Eso significa que DynamicLib.lib constains referencias, algo así como:

  • OpenWAV se encuentra en el offset 1 en DynamicLib.dll
  • CloseWAV se encuentra en el offset 2 en DynamicLib.dll etc

El nombre dinámico significa que puede ser cargado por cualquier aplicación, en realidad no enlazando con DynamicLib.lib, pero llamar LoadLibrary() y la importación de las funciones exportadas por la DLL mano.

Acerca de Relocatable, bueno en este momento no estoy familiarizado con la palabra.

Estoy hablando como un programador de Windows, así que no sé lo que realmente está pasando en Linux, pero a juzgar por el nombre SO (Objetos Compartidos) son lo mismo que las DLL.

Espero que mi respuesta haya sido útil.

10

.o archivos no son cualquier tipo de archivo de biblioteca. Son un archivo de objeto.

.a/.lib archivos están vinculados en tiempo de compilación. No pueden ser reemplazados después del hecho. Esto los hace estáticos.

.so/.dll archivos están vinculados en tiempo de ejecución. Se pueden reemplazar en cualquier momento antes de que comience la ejecución. Esto los hace dinámicos.

La reubicación se refiere a la colocación de un binario en la memoria; el código de las bibliotecas estáticas está integrado con el binario y, por lo tanto, no se puede reubicar de forma independiente.

4

bibliotecas estáticas contienen código que se copia en el ejecutable. El código en la biblioteca que no está referenciado por su programa se elimina. Un programa con solo bibliotecas estáticas no tiene ninguna dependencia durante el tiempo de ejecución.

Las bibliotecas dinámicas se vinculan durante el tiempo de ejecución: un programa con referencias a una biblioteca dinámica se cargará y vinculará con la biblioteca cuando se inicie (o bajo demanda).

Una biblioteca reubicable es otra palabra para una biblioteca dinámica. Cuando se vincula con una biblioteca dinámica, las direcciones de las funciones que contiene se calculan en función de dónde se carga la biblioteca en la memoria. Son "reubicables" porque las direcciones de las funciones contenidas no se determinan en el momento del enlace. (En una biblioteca estática, las direcciones se calculan durante el tiempo de enlace.)

Un archivo de objeto (.o) contiene código compilado, pero no contiene las direcciones finales de todas las funciones. El enlace es el proceso por el cual el enlazador revisa todos los archivos de objeto y calcula la dirección correcta para cada función a la que se llama.

Cuestiones relacionadas