static-libraries crear - Archivos DLL y LIB:¿qué y por qué?




c++ create (5)

Otro aspecto es la seguridad (ofuscación). Una vez que se extrae un fragmento de código de la aplicación principal y se coloca en una Biblioteca de vínculos dinámicos "separada", es más fácil atacar, analizar (aplicar ingeniería inversa) el código, ya que se ha aislado. Cuando el mismo fragmento de código se guarda en una Biblioteca LIB, es parte de la aplicación de destino compilada (vinculada), y por lo tanto es más difícil aislar (diferenciar) ese fragmento de código del resto de los binarios de destino.

Sé muy poco sobre las DLL y las LIB salvo que contienen un código vital necesario para que un programa se ejecute correctamente: bibliotecas. Pero, ¿por qué los compiladores los generan en absoluto? ¿No sería más fácil incluir todo el código en un solo ejecutable? ¿Y cuál es la diferencia entre DLL y LIB?


Otra diferencia radica en el rendimiento.

Como el DLL se carga en tiempo de ejecución por el .exe (s), el .exe (s) y el DLL funcionan con el concepto de memoria compartida y, por lo tanto, el rendimiento es bajo en relación con el enlace estático.

Por otro lado, un .lib es un código que está vinculado estáticamente en tiempo de compilación en cada proceso que solicita. Por lo tanto, el .exe (s) tendrá memoria única, lo que aumenta el rendimiento del proceso.


Una DLL es una biblioteca de funciones que se comparten entre otros programas ejecutables. Simplemente busque en su directorio windows / system32 y encontrará docenas de ellos. Cuando su programa crea una DLL, normalmente también crea un archivo lib para que la aplicación * .exe pueda resolver los símbolos declarados en la DLL.

A .lib es una biblioteca de funciones que están vinculadas estáticamente a un programa, NO son compartidas por otros programas. Cada programa que se vincula con un archivo * .lib tiene todo el código en ese archivo. Si tiene dos programas, A.exe y B.exe, que enlazan con C.lib, cada A y B contendrán el código en C.lib.

La forma de crear archivos DLL y libs depende del compilador que use. Cada compilador lo hace de manera diferente.


Hay bibliotecas estáticas (LIB) y bibliotecas dinámicas (DLL).

Las bibliotecas se utilizan porque es posible que tenga un código que quiera usar en muchos programas. Por ejemplo, si escribe una función que cuenta el número de caracteres en una cadena, esa función será útil en muchos programas. Una vez que obtiene esa función funcionando correctamente, no desea tener que volver a compilar el código cada vez que la usa, por lo que coloca el código ejecutable para esa función en una biblioteca, y el enlazador puede extraer e insertar el código compilado en su programa. . Las bibliotecas estáticas a veces se llaman 'archivos' por este motivo.

Las bibliotecas dinámicas dan un paso más. Parece un desperdicio tener múltiples copias de las funciones de la biblioteca ocupando espacio en cada uno de los programas. ¿Por qué no pueden todos compartir una copia de la función? Esto es para lo que son las bibliotecas dinámicas. En lugar de construir el código de la biblioteca en su programa cuando se compila, puede ejecutarse asignándolo a su programa a medida que se carga en la memoria. Múltiples programas que se ejecutan al mismo tiempo y usan las mismas funciones, todos pueden compartir una copia, guardando la memoria. De hecho, puede cargar bibliotecas dinámicas solo según sea necesario, dependiendo de la ruta a través de su código. No tiene sentido que las rutinas de la impresora ocupen la memoria si no está imprimiendo. Por otro lado, esto significa que debe tener una copia de la biblioteca dinámica instalada en cada máquina en la que se ejecuta su programa. Esto crea su propio conjunto de problemas.

Como ejemplo, casi todos los programas escritos en "C" necesitarán funciones de una biblioteca llamada "C biblioteca de tiempo de ejecución", aunque pocos programas necesitarán todas las funciones. El tiempo de ejecución de C viene en versiones estáticas y dinámicas, por lo que puede determinar qué versión utiliza su programa según las necesidades particulares.


En primer lugar, debe comprender la diferencia entre dos tipos muy diferentes de DLL. Microsoft decidió ir con las mismas extensiones de archivo (.exe y .dll) con .NET (código administrado) y código nativo, sin embargo, DLL de código administrado y DLL nativos son muy diferentes en el interior.

1) ¿En qué punto web.dll se vincula dinámicamente a business.dll? Se nota mucho en el disco duro de Windows al agotar las tareas aparentemente pequeñas al usar Word, etc., y reconozco que esta palabra se está apagando y enlazando dinámicamente la funcionalidad de otras DLL.

1) En el caso de .NET, las DLL generalmente se cargan a pedido cuando se ejecuta el primer método que intenta acceder a algo desde la DLL. Esta es la razón por la que puede obtener TypeNotFoundExceptions en cualquier parte de su código si no se puede cargar una DLL. Cuando algo como Word repentinamente comienza a acceder al HDD mucho, es probable que se intercambie (obteniendo datos que se han intercambiado en el disco para dejar espacio en la RAM).

1a) Además, ¿qué carga y vincula el archivo DLL: el O / S o algún marco de tiempo de ejecución como el .Net framework?

1a) En el caso de los DLL administrados, el .NET framework es lo que carga, JIT compila (compila el bytecode de .NET en código nativo) y vincula los DLL. En el caso de las DLL nativas, es un componente del sistema operativo que carga y vincula la DLL (no es necesaria la compilación porque las DLL nativas ya contienen código nativo).

1b) ¿Cuál es el proceso de "vinculación"? ¿Se hacen comprobaciones de que hay compatibilidad? Cargando en la misma memoria? ¿Qué significa realmente vincular?

1b) La vinculación se produce cuando las referencias (por ejemplo, llamadas a métodos) en el código de llamada a símbolos (por ejemplo, métodos) en la DLL se reemplazan con las direcciones reales de las cosas en la DLL. Esto es necesario porque las direcciones finales de las cosas en la DLL no se pueden conocer antes de que se haya cargado en la memoria.

2) ¿Qué es lo que realmente ejecuta el código en la DLL? ¿El procesador lo ejecuta o hay otra etapa de traducción o compilación antes de que el procesador comprenda el código dentro de la DLL?

2) En Windows, los archivos .exe y .dll son bastante idénticos. Los archivos nativos .exe y .dll contienen código nativo (lo mismo que el procesador ejecuta), por lo que no es necesario traducir. Los archivos .exe y .dll administrados contienen .NET bytecode que es el primer JIT compilado (traducido al código nativo).

2a) En el caso de una DLL construida desde C # .net, ¿qué está ejecutando esto? ¿El framework .Net o el sistema operativo directamente?

2a) Después de que el código ha sido compilado JIT, se ejecuta de la misma manera que cualquier código.

3) ¿Funciona una DLL de, por ejemplo, Linux en un sistema Windows (si existe tal cosa) o son específicos del sistema operativo?

3) Las DLL administradas pueden funcionar tal como están, siempre que los marcos en ambas plataformas estén actualizados y quien haya escrito la DLL no rompió deliberadamente la compatibilidad mediante el uso de llamadas nativas. Las DLL nativas no funcionarán in situ, ya que los formatos son diferentes (aunque el código de la máquina en el interior es el mismo, si ambos son para la misma plataforma de procesador). Por cierto, en Linux, las "DLL" se conocen como archivos .so (objeto compartido).

4) ¿Son específicos para un marco particular? ¿Puede una DLL creada utilizando C # .Net ser utilizada por una DLL construida con Borland C ++ (solo ejemplo)?

4) Las DLL administradas son particulares del framework .NET, pero naturalmente funcionan con cualquier lenguaje compatible. Las DLL nativas son compatibles siempre que todos utilicen las mismas convenciones (convenciones de llamadas (cómo se pasan los argumentos de función en el nivel de código de máquina), nombres de símbolo, etc.)

5) Volviendo al ejemplo web.dll / business.dll. Para obtener un tipo de clase de cliente, necesito hacer referencia a business.dll desde web.dll. Esto debe significar que business.dll contiene una especificación de lo que realmente es una clase de cliente. Si hubiera compilado mi archivo business.dll, digamos que Delphi lo entendería y podría crear una clase de clientes, o hay algún tipo de información de encabezado o algo que diga "hey, lo siento, solo puedes usarme de otro delphi dll". .

5) Las DLL administradas contienen una descripción completa de cada clase, método, campo, etc. que contienen. AFAIK Delphi no es compatible con .NET, por lo que crearía DLL nativas, que no se pueden usar en .NET directamente. Probablemente podrá llamar funciones con PInvoke, pero las definiciones de clase no se encontrarán. No uso Delphi, así que no sé cómo almacena información de tipo con DLL. C ++, por ejemplo, se basa en archivos de encabezado (.h) que contienen las declaraciones de tipo y deben distribuirse con la DLL.

6) En el tema del secuestro de DLL, seguramente el DLL de reemplazo (defectuoso) debe contener las firmas de método exacto, tipos como el que está siendo secuestrado. Supongo que esto no sería difícil si pudieras averiguar qué métodos estaban disponibles en la DLL original.

6) De hecho, no es difícil de hacer si puede cambiar fácilmente la DLL. La firma de código se puede usar para evitar esto. Para que alguien pueda reemplazar una DLL firmada, deberían saber la clave de firma, que mantuvo en secreto.

6a) ¿Alguna pregunta repetida aquí pero esto se remonta a lo que en mi programa C # está decidiendo si puedo acceder a otra DLL? Si mi DLL secuestrado contenía exactamente los mismos métodos y tipos que el original, pero se compiló en otro idioma, ¿funcionaría?

6a) Funcionaría siempre que sea una DLL administrada, hecha con cualquier lenguaje .NET.

  • ¿Qué es la importación de DLL? y el registro dll?

La "importación de DLL" puede significar muchas cosas, por lo general, significa hacer referencia a un archivo DLL y usar elementos en él.

El registro DLL es algo que se hace en Windows para registrar globalmente archivos DLL como componentes COM para que estén disponibles para cualquier software en el sistema.