Sei sulla pagina 1di 10

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA

FACULTAD DE INGENIERÍA

ESCUELA DE CIENCIAS Y SISTEMAS

SISTEMAS OPERATIVOS 2

INVESTIGACION: BIBLIOTECAS

EN UN SISTEMA OPERATIVO

Guatemala, 4 de septiembre de 2010

Jonathan Morales
INTRODUCCION

El trabajo que se muestra a continuación es una pequeña recopilación de aspectos muy importantes
en la utilización y creación de bibliotecas estáticas y dinámicas.
Como se vera en el desarrollo del trabajo, una biblioteca (o librería) pone a disposición de diversos
programas las rutinas y funciones para que puedan se utilizadas sin volver a escribir el código. Asimismo, se
determinara que estas bibliotecas son muy utilizadas en los distintos sistemas operativos, para darles
funcionalidad a los programas.
Para poder implementar de una forma adecuada las bibliotecas, es necesario y muy
importante conocer la forma en que son compilados los programas y como se enlazan con otros ejecutables,
cuales son sus restricciones y condiciones para que se cumpla el objetivo que permite a un programa utilizar
una biblioteca para tener la funcionalidad de una función o rutina especifica.

Las bibliotecas pueden enlazarse de distintas manera, como se estudiara mas a fondo, se hacen de forma
estática y dinámica, donde cada uno de estas maneras de enlazar a una biblioteca ofrece distintas ventajas
y desventajas, que dependerán en gran medida de la finalidad del programa.

La forma de enlazar un programa con una biblioteca, determinara si obtiene para si mismo el código que
necesita para funcionar, como sucede en el enlace estático, o utilizar el código cuando el programa sea
ejecutado, haciendo mas liviano al programa y delegando al sistema la localización de la librería cuando sea
conveniente en la ejecución, que es el caso de un programa que se enlaza dinámicamente.
OBJETIVOS

• -Conocer los tipos de bibliotecas que pueden utilizarse en un programación


• -Conocer las diferencias entre las bibliotecas estáticas y las dinámicas
• -Determinar en que momento es conveniente utilizar un tipo de librería u otro
• -Poder implementar una librería a la cual pueda enlazarse un programa
HISTORIA

El origen de las bibliotecas (o librerías) se da por la necesidad de realizar programas ayudados de porciones
de código que ya han sido elaborados.
Durante mucho tiempo, se cayo en la cuenta que esas porciones de código eran muy utilizados por distintos
programas, lo que llevo a separarlos del programa fuente, y poder ser utilizados únicamente al enlazarlos.
Esta forma de trabajo, donde se crean las rutinas de programación en otro lugar, vino a traer el concepto de
“biblioteca”. Para poder realizar dicho enlace, se requirió emplear otro programa (enlazador) encargado de
hacer la referencia entre el programa fuente y la biblioteca.

En el principio de esta forma de trabajo, se quizo separar los datos de un programa fuente con sus rutinas,
iniciado por JOVIAL a través de “Communication Pool”. Lo que se buscaba era separar ambas partes, para
dividir el desarrollo en porciones mas pequeñas, junto a esto se desarrolla el concepto de
“encapsulamiento” de forma que se pueda ocultar la información.
A través del tiempo, distintos lenguajes han hecho aportes en el uso de bibliotecas ya que han hecho
implementaciones análogas a este termino: COBOL empleo un sistema de bibliotecas, con FORTRAN se
pudo compilar subprogramas de forma independiente, Simula 67 por ser orientado a objetos utilizo las
bibliotecas (y uso de clases).
De esta forma, el concepto se ha ido mejorando y utilizando ampliamente, de tal forma que diversos
lenguajes emplean los términos “paquete”, “modulo”, para referirse a código que se encuentra en otro
lugar (o parte del sistema operativo) y ser incluidos en tiempo de compilación(librerías estáticas) o utilizados
en tiempo de ejecución(librerías dinámicas).

En unix las librerías estáticas suelen llamarse lib[nombre].a y las dinámicas lib[nombre].so:
[nombre] es el nombre de la librería.

LIBRERIA ESTATICA (.a)

Una librería estática es un archivo con código que "se copia" a un programa cuando se compila. Esto
produce un archivo ejecutable con todo el flujo del programa, es decir, la librería no se vuelve a utilizar o ya
no se requiere para ejecutar dicho programa. Esto significa que ya no se dependerá de esa librería para que
funcione el programa, ya que tiene una copia del código que fue llamado.
Cuando se compila un programa que utiliza una librería estática, el enlazador se encarga de colocar el
código y de hacerlo localizable en el programa (por medio de direcciones relocalizables).
Esto hace que una librería estática sea un archivo objeto(compilado) que al construir un programa es
incluido por el enlazador (linker).
Características:
Se enlaza en tiempo de compilación.
Una vez compilado, el programa ya no depende de ninguna librería, lo que lo hace portable.
El enlace estático va a depender del compilador.

LIBRERIA DINAMICA (.so)

A diferencia de una librería estática, una librería dinámica no se copia en el programa cuando se compila,
sino que es un código que puede ser utilizado por el programa en tiempo de ejecución. Esto significa que
otros programas pueden utilizar la librería cuando son ejecutados, y en el momento que lo requieran. Esto
implica que la librería debe existir para que el programa se ejecute, por lo que debe establecen mecanismos
y rutas donde encontrarlo.

Una librería dinámica se utiliza de la misma manera que una librería estática desde un programa. Si no se
define de otra manera, el compilador buscara primero una versión dinámica, si no existe buscara la estática.
Para emplear la versión estática se indica con [-static].

El enlace dinámico depende del sistema operativo, lo que permite que las librerias pueden ser utilizadas en
cualquier aplicación.

El orden donde el sistema buscara una librería dinámica es:


Directorios de la variable LD_LIBRARY_PATH
En el archivo ld.so.cache
En /usr/lib
En /lib
En los directorios contenidos en el archivo ld.so.conf

SONAME

Es un nombre que especifica la versión de construcción de un objeto compartido. Su función es la indicar al


programador la compatibilidad con el sistema. De esta manera, un programa que sabe que librería necesita
para enlazarse (en tiempo de ejecución) puede determinar cuales son compatibles a partir del soname.
Este nombre es una cadena que lleva el nombre de la biblioteca, y la versión indica al sistema
compatibilidad hacia atrás.

Los beneficios de esto, es que se puedan hacer modificaciones a las librerías sin recompilar los programas.
Cada vez que se modifica una librería, cambian los números de versión, suponiendo libtest.so.x.y.z:
x (major number) = determina las versiones que compatibles
y (release) = cuando se modifica la interfaz de la librería
z (epoch) = cuando se corrige algún error o existe un cambio interno

Para colocarle una versión a una librería, se pasa el valor al enlazador desde el compilador con [-Wl] y las
opciones separadas por comas:
$ gcc -Wl,-soname,libtest.so.0.0.0 -shared -fPIC -o libtest.so.0.0.0 test1.o test2.o

Al compilar, se busca la librería con extensión .so, razón por la cual deben crearse enlaces simbólicos a la
librería, de forma de tener un soname mas general que pueda ser encontrado:
$ ln -s libtest.so.0.0 libfich.so
$ ln -s libtest.so.0.0 libfich.so.0

ENL ACE DINAMICO(Dynamic Linking):

Es un enlace donde varios programas comparten un sola copia de la librería en memoria RAM.
Esta forma es el proceso de compilación de código objeto que esta en la copia de la librería dentro del
ejecutable del programa. Una vez compilado un programa fuente, hay símbolos en el código objeto que son
referencias a rutinas externas, es decir, se registran las rutinas necesarias (indice de nombres o números de
la rutinas). El linkeador encuentra estos símbolos y los coloca en el archivo (con enlace estático, el
linkeador copiara la rutina completa), que es accedido en tiempo de ejecución a la librería compartida. La
librería compartida es cargada una vez en memoria y disponible para cualquier programa.
Cuando un programa solicita una librería dinámica para cargar, la dirección de la librería se asigna por el
enlazador (y sus rutinas se manejan por un espacio de direcciones virtual). Cuando el programa llama a una
de estas rutinas, la dirección se traduce a la ubicación real del código, donde se puede ejecutar.
En enlace dinámico permite que se pueda ahorrar espacio en memoria debido a grandes librerías que se
cargan una sola vez, y son compartidas. En contraparte, es mas complejo por las tareas que deben realizar
el enlazador y el cargador, o que no se encuentre alguna librería requerida por un programa.

CARGA DINAMICA (Dynamic Loading):

Es una forma para cargar (o descargar) en tiempo de ejecución un librería cuando se requiere. La petición
puede darse al compilar, o al ejecutar:
Al compilar cuando el linkeador coloca referencias a la librería con rutas de archivos (o únicamente el
nombre).
En ejecución es cuando las aplicaciones hacen llamadas a un API del sistema operativo.

La mayoría de sistemas operativos que soportan enlace dinámico, también soportan la carga dinámica con
el linkeador al API, en Windows se utiliza: “LoadLibrary”,”FreeLibrary”, y en sistemas UNIX “dlopen”,
“dlclose”, “dlsym”.
Una vez cargado en memoria, se recuperan las direcciones de las funciones y variables de la librería, se
ejecutan y luego se descarga la librería de la memoria. La carga dinámica permite a un programa iniciarse
aunque no se tengan las librerías, con lo que se obtiene funcionalidad.
El uso mas frecuente de la carga dinámica es el uso de plugin para distintos programas.

Ventajas y Desventajas (Enlace dinámico y carga dinámica)


VENTAJAS:
• El enlace dinámico permite a varios programas compartir la misma librería una vez cargada en
memoria
• La carga dinámica permite que un programa pueda iniciarse mientras se localiza la librería, esta
forma de operación es como trabajan los plugin para los programas.
DESVENTAJAS:
• El enlace dinámico requiere de mayor trabajo para el enlazador y cargador, y si no existe o no se
encuentra la versión de la librería no ejecuta el programa que lo utiliza.
• Con la carga dinámica, una vez utilizada la librería se puede descargar de memoria, lo que significa
que cada programa que lo utilice deberá cargarlo(y descargarlo).

VENTAJAS Y DESVENTAJAS (librerias estaticas, dinamicas)

VENTAJAS LIBRERIAS ESTATICAS


• No necesita la librería para funcionar una vez creado el ejecutable (ni otras librerías)
• Una vez compilado, puede llevarse a otro ordenador sin llevar las librerías.
• Los programas son mas rápidos en ejecución, ya que posee las rutinas en su código y no debe ir a
buscarlas para ejecutarlas.
• Cambios en las librerías estáticas no afectan a los ejecutables (desventaja si el cambio es para
corregir un error, porque deberán recompilarse los programas para hacer el cambio)
• En el programa son agregadas únicamente las rutinas que utiliza
• Se recomiendan en programas no muy grandes.

DESVENTAJAS LIBRERIAS ESTATICAS


• Programa compilado posee un ejecutable mas grande (tiene copia del código), siendo un
inconveniente para el tamaño de memoria.
• Cambios en la librería provoca que sean recompilados los ejecutables que la utilizan.

VENTAJAS LIBRERIAS DINAMICAS


• Es compartida por varios programas, de manera que solo necesita una copia en el sistema.
• Cambios en las librerías para corregir errores se hacen en todos los programas que la utilicen, es
decir, no es necesario recompilar los programas (manteniendo siempre la interfaz)
• La librería es cargada cuando se requiere, o descargada si no se utilizara mas.
• Se recomiendan en programas grandes o librerías del sistema, ya que se tienen en otros
ordenadores

DESVENTAJAS LIBRERIAS DINAMICAS


• Difícil depuración por el control de las versiones e incompatibilidades
• Deben existir las librerías en el sistema para poder ejecutar los programas
• Las librerías dinámicas deben ser cargadas completamente aunque solo se utilice una parte
CONCLUSIONES

• Una biblioteca es un programa que dispone de diversas funciones o rutinas que son utilizadas por
otros programas
• Las bibliotecas poseen el código que utilizaran los programas, y aunque no son programas
ejecutables, deben existir al enlazarse
• La forma en que se enlacen los programas determina su forma de operación, de manera el código
de la librería es agregado al ejecutable o se va a requerir cuando se ejecute.
• Un enlace estático es cuando el código de la librería es agregado dentro del programa que lo utiliza,
de forma que al generarse el ejecutable posee todo lo necesario para ejecutarse, aunque se ejecute
en un lugar donde no se tiene la librería.
• Una librería dinámica debe existir en el sistema, puesto que los programas que la utilizan la
buscaran y cargaran en memoria cuando se ejecuten, haciendo en ese momento de sus rutinas.
• El soname es un nombre que se emplea en el enlace dinámico que especifica una versión de
construcción, de manera que cuando se modifique o tenga una nueva versión, haya compatibilidad
hacia atrás.
• La carga dinámica se diferencia del enlace dinámico en que los programas cargan a memoria sus
librerías y luego las descargan, siendo la forma de operación de los plugins
RECOMENDACIONES

• Para poder implementar adecuadamente una librería, es imprescindible conocer los objetivos del
programa, para poder establecer que tipo de enlace es el mas adecuado.
• Hacer un programa con enlace estático para hacerlo portable, sin tener que llevar consigo la librería,
sino que únicamente el ejecutable.
• Para sistemas que ya dispongan las librerías, puede emplearse los programas con enlace dinámico,
ya que se hará mas liviano y podrá ser compartido por varios programas, al cargarse una sola vez
en memoria.
• Como en el caso de sistemas UNIX, que poseen distintas librerías de uso común, es recomendable
utilizar el enlace dinámico, ya que por lo regular se colocan en las mismas ubicaciones

Potrebbero piacerti anche