Este artículo no es para esos geeks algorítmicos. Si está interesado en cosas relacionadas con los sistemas, siga leyendo…
Las bibliotecas compartidas son útiles para compartir código, que es común en muchas aplicaciones. Por ejemplo, es más económico empaquetar todo el código relacionado con la implementación de TCP/IP en una biblioteca compartida. Sin embargo, los datos no se pueden compartir ya que cada aplicación necesita su propio conjunto de datos. Aplicaciones como navegador, ftp, telnet, etc… hacen uso de la biblioteca de ‘red’ compartida para elevar funcionalidades específicas.
Cada sistema operativo tiene su propia representación y conjunto de herramientas para crear bibliotecas compartidas. Más o menos los conceptos son los mismos. En Windows, todos los archivos de objetos (*.obj, *.dll, *.ocx, *.sys, *.exe, etc.) siguen un formato llamado Portable Executable. Incluso las bibliotecas compartidas (llamadas bibliotecas vinculadas dinámicas o DLL en resumen) también se representan en formato PE. El conjunto de herramientas que se utiliza para crear estas bibliotecas debe comprender el formato binario. Las variantes de Linux siguen un formato llamado formato ejecutable y enlazable (ELF). Los archivos ELF son de formato independiente de la posición (PIC). Las bibliotecas compartidas en Linux se conocen como objetos compartidos (generalmente con la extensión *.so). Estos son similares a las DLL en la plataforma Windows. Incluso los archivos de objetos compartidos siguen el formato binario ELF.
Recuerde, las extensiones de archivo (*.dll, *.so, *.a, *.lib, etc…) son solo para conveniencia del programador. No tienen ningún significado. Todos estos son archivos binarios. Puedes nombrarlos como quieras. Sin embargo, asegúrese de proporcionar rutas absolutas en la creación de aplicaciones.
Por lo general, cuando compilamos una aplicación los pasos son sencillos. Compilar, vincular y cargar. Sin embargo, no es sencillo. Estos pasos son más versátiles en los sistemas operativos modernos.
Cuando vincula su aplicación con la biblioteca estática, el código es parte de su aplicación. No hay dependencia. Aunque hace que aumente el tamaño de la aplicación, tiene sus propias ventajas. El principal es la velocidad, ya que no habrá resolución de símbolo (una entidad de programa) en tiempo de ejecución. Dado que cada fragmento de código forma parte de la imagen binaria, dichas aplicaciones son independientes de los problemas de discrepancia de versiones. Sin embargo, el costo es solucionar un problema en el código de la biblioteca. Si hay algún error en el código de la biblioteca, toda la aplicación debe volver a compilarse y enviarse al cliente. En el caso de bibliotecas dinámicas, arreglar o actualizar las bibliotecas es fácil. Solo necesita enviar las bibliotecas compartidas actualizadas. La aplicación no necesita volver a compilarse, solo necesita volver a ejecutarse. Puede diseñar un mecanismo en el que no necesitemos reiniciar la aplicación.
Cuando vinculamos una aplicación con una biblioteca compartida, el vinculador deja algunos stubs (símbolos sin resolver) para completar en el momento de la carga de la aplicación. Estos apéndices deben ser llenados por una herramienta llamada vinculador dinámico en tiempo de ejecución o en el momento de carga de la aplicación. Nuevamente, la carga de una biblioteca es de dos tipos, carga estática y carga dinámica. No confundas entre carga estática y enlace estático y carga dinámica y enlace dinámico .
Por ejemplo, ha creado una aplicación que depende de libstdc++, por lo que es un objeto compartido (biblioteca dinámica). ¿Cómo se da cuenta la aplicación de las bibliotecas compartidas requeridas? (Si está interesado, explore las herramientas tdump del conjunto de herramientas de Borland, objdump o nm o las herramientas readelf en Linux).
Carga estática:
- En la carga estática, todas esas bibliotecas compartidas dependientes se cargan en la memoria incluso antes de que la aplicación comience a ejecutarse. Si falla la carga de cualquier biblioteca compartida, la aplicación no se ejecutará.
- Un cargador dinámico examina la dependencia de la aplicación en las bibliotecas compartidas. Si estas bibliotecas ya están cargadas en la memoria, el espacio de direcciones de la biblioteca se asigna al espacio de direcciones virtuales (VAS) de la aplicación y el vinculador dinámico reubica los símbolos no resueltos.
- Si estas bibliotecas no están cargadas en la memoria (quizás su aplicación sea la primera en invocar la biblioteca compartida), el cargador busca en las rutas de la biblioteca estándar y las carga en la memoria, luego mapea y resuelve los símbolos. Una vez más, la carga es un gran proceso, si está interesado, escriba su propio cargador :).
- Al resolver los símbolos, si el enlazador dinámico no puede encontrar ningún símbolo (tal vez debido a una versión anterior de la biblioteca compartida), la aplicación no se puede iniciar.
Carga dinámica:
- Como su nombre lo indica, la carga dinámica consiste en cargar la biblioteca bajo demanda.
- Por ejemplo, si desea una pequeña funcionalidad de una biblioteca compartida. ¿Por qué debería cargarse en el momento de carga de la aplicación y permanecer en la memoria? Puede invocar la carga de estas bibliotecas compartidas dinámicamente cuando necesite su funcionalidad. Esto se llama carga dinámica. En este caso, el programador conoce la situación ‘cuándo se debe cargar la biblioteca’. El conjunto de herramientas y el kernel relevante proporcionan API para admitir la carga dinámica y la consulta de símbolos en la biblioteca compartida.
Más detalles en artículos posteriores.
Nota: si encuentra términos como módulos cargables o términos equivalentes, no los mezcle con bibliotecas compartidas. Son diferentes de las bibliotecas compartidas. Los núcleos proporcionan un marco para admitir módulos cargables.
Trabajar con bibliotecas compartidas | conjunto 2
Ejercicio:
1. Suponiendo que haya entendido los conceptos, ¿cómo diseña una aplicación (p. ej., Banca) que pueda actualizarse a nuevas bibliotecas compartidas sin volver a ejecutar la aplicación?
— Venki . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA