2009-12-23 3 views
10

¿El enlace y la carga de las bibliotecas dinámicas ocurren en el tiempo de ejecución? o es que solo la carga de la biblioteca ocurre en tiempo de ejecución?¿cuál es la diferencia entre vincular y cargar en lenguaje c

+0

http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean/311889#311889 – paxdiablo

+1

que no es un duplicado exacto –

Respuesta

14

Consulte el muy buen punto anterior sobre la distinción entre enlace estático y enlace dinámico. Suponiendo que se está refiriendo a la vinculación dinámica, entonces:

Tanto la carga como el enlace (dinámico) se realizan por el vinculador - en Linux y otros Unix-alikes esto se hace por /lib/ld.so, que es el programa real que se inicia por el sistema operativo en casi todos los casos. ld.so a su vez cargas su aplicación - mygameBinary en la memoria, y ld.so luego lee desde el archivo mygameBinary la lista de bibliotecas dinámicas vinculadas que requiere.

El vinculador, ld.so, carga cada una de estas bibliotecas en la memoria sucesivamente, p. Ej. libc.so, libpthread.so, libopengl.so, y mira qué otras bibliotecas pueden necesitar estos, p. libm.so.

Una vez carga se hace, entonces une comienza un proceso de mirar objetos o funciones que se exportan por una biblioteca o la aplicación, y importada por otra biblioteca o aplicación con nombre. El vinculador luego cambia varias referencias y, a veces, el código para actualizar los punteros de datos no vinculados y las llamadas a funciones en cada biblioteca para señalar dónde reside la información o función real. Por ejemplo, una llamada a printf en mygameBinary comienza señalando a nada (en realidad solo llama al enlazador), pero después de vincular se convierte en un salto a la función printf en libc.

Una vez que esta vinculación se ha completado, se inicia la aplicación, mediante la invocación de la función _start en mygameBinary, que a su vez llama a main, y el juego comienza.

La vinculación dinámica de esta manera es necesario para apoyar el siguiente:

  • actualizaciones de la biblioteca después de soltar la aplicación, que cambie la ubicación de funciones y datos.
  • sola aplicación que se ejecuta en diferentes versiones del OS
  • incertidumbre acerca de dónde la biblioteca o aplicación se pueden cargar en la memoria
  • reducir el tamaño del núcleo mediante el intercambio de RAM física usada por las bibliotecas entre múltiples aplicaciones.

Algunos sistemas operativos difieren en los detalles, por ejemplo, OSX y AIX precargan un determinado conjunto de bibliotecas en ubicaciones fijas de la memoria. Esto significa que no necesitan ser cargados, solo vinculados, lo que puede ser más rápido.

Algunos sistemas operativos como OSX y, en ocasiones, Linux admiten el pre-enlace, que es un proceso donde un script se ejecuta sobre las aplicaciones en su sistema antes de iniciarlas, y realiza el enlace.Cuando los ejecutas, no necesitas vincularlos. Esto es importante porque la vinculación requiere una considerable cantidad de tiempo de su computadora cuando inicia una aplicación, y algunas aplicaciones pueden iniciarse varias veces por segundo, como gcc, cpp y as durante el proceso de creación de la aplicación, o filtrar secuencias de comandos al indexar los datos de su computadora (OSX Spotlight).

6

Enlazar es el proceso de tomar algunos ejecutables más pequeños y unirlos como un único ejecutable más grande.

Cargando está cargando el ejecutable en la memoria antes de la ejecución.

+1

Él está preguntando por las bibliotecas dinámicas, en las que El enlace de casos NO es el proceso de incluir "ejecutables" más pequeños en uno más grande. – tgamblin

1

Ambos ocurren en tiempo de ejecución para bibliotecas dinámicas.

En primer lugar, se cargan las bibliotecas, junto con todas sus dependencias (y las dependencias de esas bibliotecas, etc.). Luego, el enlazador dinámico resuelve símbolos en las bibliotecas cargadas. Por lo general, ambas funciones se implementan con la misma pieza de software; en Linux es ld.so.

Los símbolos en las bibliotecas estáticas se resuelven en el momento del enlace y se incluyen en el archivo ejecutable. Las bibliotecas estáticas pueden, sin embargo, tener símbolos no resueltos que las bibliotecas dinámicas satisfacen en tiempo de ejecución.

Hay una descripción en profundidad de cómo sucede esto, cómo se descifran los nombres, qué tan caro es resolver símbolos en tiempo de ejecución, etc. en How to Write Shared Libraries.

3

Hay dos tipos de enlace: enlace estático y enlace dinámico.

La vinculación estática se produce en tiempo de compilación, por lo tanto, ocurre antes de cargar un programa. Con la vinculación estática, los símbolos externos que usa su programa (por ejemplo, nombres de funciones) se resuelven en tiempo de compilación.

La vinculación dinámica se produce en tiempo de ejecución, por lo que ocurre después o en el momento de la carga de un programa. Con el enlace dinámico, los símbolos se resuelven durante el tiempo de carga o en tiempo de ejecución cuando se accede al símbolo (enlace diferido). Este último es más común.

-1

Los sistemas Windows y Unix utilizan enfoques completamente diferentes para las bibliotecas dinámicas.

Las DLL de Windows no están vinculadas. Por lo tanto, no puede compartir objetos estáticos en las DLL. Es como un programa separado en su espacio de direcciones.

Los objetos compartidos Unix están realmente "vinculados" en tiempo de ejecución, al igual que los diferentes módulos del mismo proyecto, que realizan la resolución de símbolos.

+0

No es correcto, las DLL de Windows están vinculadas y pueden compartir datos. –

+0

nobugz: sugiero que busque la entrada "enlazando" y cómo funciona la resolución de símbolos. Verá por qué no hay forma de compartir una variable estática entre los límites de la DLL. –

-1

Tanto la vinculación dinámica como la carga de la biblioteca ocurren en tiempo de ejecución, pero la vinculación dinámica se realiza antes de la ejecución del programa y se realiza mediante el enlazador del sistema. Entonces, por ejemplo, si faltan las bibliotecas requeridas, el programa no se puede ejecutar. La carga de la biblioteca, por otro lado, se realiza por el programa en sí, a través de las funciones dlopen/LoadLibrary. En este caso, el proceso de carga está controlado por la aplicación, que puede, por ejemplo, manejar errores.

+0

Entonces, ¿cuándo ocurre la carga? ¿Está antes de la etapa de enlace (en caso de vinculación dinámica) – Vijay

+0

En caso de carga, la biblioteca se carga cuando el programa llama a la función dlopen/LoadLibrary. Puede suceder siempre que el programador quiera;) –

0

file01.c, file02.c -> produces -> file01.o, file02.o -> Estas informaciones .o son archivadas y puestas en una única biblioteca dinámica, es decir, lib1.a file11. c, archivo12.c -> produce -> archivo11.o, archivo12.o -> Estas informaciones .o son archivadas y puestas en una única biblioteca dinámica, que es lib2.a

Ahora, tengo 2 bibliotecas que finalmente se unen para generar el ejecutable (como .elf o .mot o .fls). Este proceso de vincular información de lib1.a y lib2.a para formar un único ejecutable se denomina enlace.

Ahora, necesito cargar esto en la memoria para ejecutarlo y ver el comportamiento del ejecutable final. El proceso de cargar el ejecutable final (como .elf o .mot o .fls) en la memoria para ejecutarlo se denomina carga.

Espero que esto borre la importancia de vincular y cargar (sin embargo las definiciones no son apropiadas :-)).

+0

conozco el proceso de vincular y cargar ... lo que necesito es cuál de ellos sucederá primero y por qué? – Vijay

+0

Definitivamente se trata de vincular lo que sucede primero ... lo que nos da el ejecutable final ... que luego se carga para su ejecución ... por lo que se vincula primero, seguido de la carga ... por cierto, disculpa la respuesta tardía. .. :-) – wrapperm

Cuestiones relacionadas