renderstatic react helmet dynamic linker operating-system loading

dynamic - renderstatic - react helmet sync



¿Diferencia entre carga dinámica y enlace dinámico? (8)

La rutina no se carga hasta que se llama. Todas las rutinas se guardan en el disco en un formato de carga re-localizable. El programa principal se carga en la memoria y se ejecuta. Esto se llama enlace dinámico.

¿Por qué esto se llama enlace dinámico? ¿No debería ser carga dinámica porque la rutina no se carga hasta que se llama en carga dinámica donde en enlace dinámico, vinculación pospuesta hasta el tiempo de ejecución.


El enlazador dinámico es un programa de tiempo de ejecución que carga y enlaza todas las dependencias dinámicas de un programa antes de comenzar a ejecutar ese programa. El enlazador dinámico encontrará qué bibliotecas dinámicas requiere un programa, qué bibliotecas requieren esas bibliotecas (y así sucesivamente), luego cargará todas esas bibliotecas y se asegurará de que todas las referencias a funciones apunten correctamente al lugar correcto. Por ejemplo, incluso el programa "hello world" más básico generalmente requerirá que la biblioteca C muestre la salida, por lo que el enlazador dinámico cargará la biblioteca C antes de cargar el programa hello world y se asegurará de que todas las llamadas a printf () se realicen. al código correcto.


Esta respuesta supondrá que sabes el comando básico de Linux.

En Linux, hay dos tipos de bibliotecas: estáticas o compartidas.

Para poder llamar a funciones en una biblioteca estática, debe vincular estáticamente la biblioteca a su ejecutable, lo que da como resultado un binario estático.

Mientras que para llamar a funciones en una biblioteca compartida, tiene dos opciones.

La primera opción es la vinculación dinámica, que se usa comúnmente: cuando compiles tu ejecutable, debes especificar la biblioteca compartida que usa tu programa, de lo contrario, ni siquiera se compilará. Cuando su programa se inicia, el trabajo del sistema es abrir estas bibliotecas, que pueden enumerarse con el comando ldd .

La otra opción es la carga dinámica: cuando su programa se ejecuta, el trabajo del programa es abrir esa biblioteca. Dichos programas generalmente están vinculados con libdl, que proporciona la capacidad de abrir una biblioteca compartida.

Extracto de Wikipedia:

La carga dinámica es un mecanismo mediante el cual un programa de computadora puede, en tiempo de ejecución, cargar una biblioteca (u otro binario) en la memoria, recuperar las direcciones de las funciones y variables contenidas en la biblioteca, ejecutar esas funciones o acceder a esas variables, y descargar las biblioteca de la memoria. Es uno de los 3 mecanismos por los cuales un programa de computadora puede usar algún otro software; Los otros dos son enlaces estáticos y enlaces dinámicos. A diferencia de la vinculación estática y dinámica, la carga dinámica permite que un programa de computadora se inicie en ausencia de estas bibliotecas, para descubrir las bibliotecas disponibles y potencialmente obtener funcionalidad adicional.

Si aún está confundido, primero lea este impresionante artículo: Anatomía de las bibliotecas dinámicas de Linux y cree el ejemplo de carga dinámica para tener una idea de ello, luego vuelva a esta respuesta.

Aquí está mi salida de ldd ./dl :

linux-vdso.so.1 => (0x00007fffe6b94000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f400f1e0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f400ee10000) /lib64/ld-linux-x86-64.so.2 (0x00007f400f400000)

Como puede ver, dl es un ejecutable dinámico que depende de libdl , que está enlazado dinámicamente por ld.so , el enlazador dinámico de Linux cuando ejecuta dl . Lo mismo es cierto para las otras 3 bibliotecas en la lista.

libm no se muestra en esta lista, porque se usa como una biblioteca cargada dinámicamente. No se carga hasta que se le pide a ld que lo cargue.


Hay dos tipos de vinculación estática y dinámica, cuando el archivo de salida se ejecuta sin ninguna dependencia (archivos = Biblioteca) en el tiempo de ejecución, este tipo de vinculación se llama estática, donde como dinámica es de dos tipos 1. Vinculación dinámica de carga Vinculación dinámica del tiempo de ejecución .Estos se describen a continuación

La vinculación dinámica se refiere a la vinculación durante el tiempo de ejecución, donde los archivos de la biblioteca se llevan a la memoria primaria y se vinculan .. (Independientemente de la función, estos están vinculados).

La vinculación dinámica en tiempo de ejecución se refiere a la vinculación cuando es necesario, lo que significa que cada vez que se produce una llamada de función en ese momento se vincula durante la ejecución. No todas las funciones están vinculadas y esto difiere en la escritura del código.


La carga dinámica se refiere a la asignación (o, con menos frecuencia, a la copia) de un ejecutable o una biblioteca en la memoria de un proceso una vez iniciado. La vinculación dinámica se refiere a la resolución de símbolos, asociando sus nombres con direcciones o desplazamientos, después del tiempo de compilación.

Aquí está el enlace a la respuesta completa por Jeff Darcy en quora

http://www.quora.com/Systems-Programming/What-is-the-exact-difference-between-Dynamic-loading-and-dynamic-linking/answer/Jeff-Darcy


También estoy leyendo el "libro de dinosaurios" y me confundieron con el concepto de carga y conexión. Aquí está mi entendimiento:

  1. Tanto la carga dinámica como la vinculación se realizan en tiempo de ejecución y cargan lo que necesitan en la memoria.

  2. La diferencia clave es que la carga dinámica verifica si el cargador cargó la rutina, mientras que la vinculación dinámica verifica si la rutina está en la memoria .

  3. Por lo tanto, para la vinculación dinámica, solo hay una copia del código de la biblioteca en la memoria, lo que puede no ser cierto para la carga dinámica. Es por eso que la vinculación dinámica necesita soporte para verificar la memoria de otros procesos. Esta característica es muy importante para las bibliotecas de subrutinas de idioma, que son compartidas por muchos programas.


Utilizamos carga dinámica para lograr una mejor utilización del espacio.

  • Con la carga dinámica, un programa no se carga hasta que se llama . Todas las rutinas se guardan en un disco en un formato de carga reubicable. El programa principal se carga en la memoria y se ejecuta.
  • Cuando una rutina necesita llamar a otra rutina, la rutina de llamada primero verifica si se ha cargado. De lo contrario, se llama al cargador de enlace reubicable para cargar la rutina deseada en la memoria y actualizar las tablas de direcciones del programa para reflejar este cambio. Luego el control es pasado a la rutina recién cargada

Ventajas

  1. Una rutina no utilizada nunca se carga. Esto es más útil cuando el código del programa es grande donde se necesitan casos que ocurren con poca frecuencia, como las rutinas de error. En este caso, aunque el código del programa es grande, el código utilizado será pequeño.
  2. La carga dinámica no necesita un soporte especial del OS. Es responsabilidad del usuario diseñar su programa para aprovechar el método. Sin embargo, el SO puede proporcionar bibliotecas para ayudar al programador

Dynamic Loading: carga de rutina en la memoria principal en llamada.

Dynamic Linking: carga la rutina en la memoria principal durante el tiempo de ejecución, si la llamada ocurre antes del tiempo de ejecución, se pospone hasta el tiempo de ejecución.

La carga dinámica no requiere soporte especial del sistema operativo, es responsabilidad del programador verificar si la rutina que se va a cargar no existe en la memoria principal.

La vinculación dinámica requiere un soporte especial del sistema operativo, la rutina cargada a través de la vinculación dinámica se puede compartir a través de varios procesos.

La rutina no se carga hasta que se llama. Todas las rutinas se guardan en el disco en un formato de carga re-localizable. El programa principal se carga en la memoria y se ejecuta. Esto se llama enlace dinámico.

La declaración está incompleta. "El programa principal se carga en la memoria principal y se ejecuta". No especifica cuándo se carga el programa.

Si consideramos que está cargado en la llamada, como especifica la instrucción , su carga dinámica


La carga dinámica significa cargar la biblioteca (o cualquier otro binario) en la memoria durante la carga o el tiempo de ejecución.

Se puede imaginar que la carga dinámica es similar a los complementos, es decir, un exe puede ejecutarse antes de que ocurra la carga dinámica (la carga dinámica, por ejemplo, puede crearse usando la llamada LoadLibrary en C o C ++)

La vinculación dinámica se refiere a la vinculación que se realiza durante la carga o el tiempo de ejecución y no cuando se crea el archivo ejecutable.

En el caso de vincular dinámicamente el enlazador mientras se crea el exe, el trabajo es mínimo. Para que el vinculador dinámico funcione, también tiene que cargar las bibliotecas. Por lo tanto, también se denomina cargador de vinculación.

Por lo tanto, las oraciones a las que hace referencia pueden tener sentido, pero siguen siendo bastante ambiguas, ya que no podemos inferir el contexto al que se refiere. ¿Puede informarnos dónde encontró estas líneas y en qué contexto habla el autor?