Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACULTAD DE INGENIERÍA
SISTEMAS OPERATIVOS 2
INVESTIGACION: BIBLIOTECAS
EN UN SISTEMA OPERATIVO
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
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.
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.
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.
SONAME
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
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.
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.
• 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