Shared Library

Una biblioteca compartida (también conocido como un objeto compartido, o como una biblioteca enlazada dinámicamente) es similar a un archivo en que se trata de una agrupación de archivos de objeto. Sin embargo, hay muchos importante differences.The diferencia más fundamental es que cuando una biblioteca compartida está vinculado a un programa, el ejecutable final no contiene realmente el código que está presente en la biblioteca compartida. En lugar de ello, el ejecutable sólo contiene una referencia a la biblioteca compartida. Si varios programas en el sistema están enlazados con la misma biblioteca compartida, todos ellos hacen referencia a la biblioteca, pero no serán realmente included.Thus, la biblioteca es compartida entre todos los programas que enlazan con él.

Una segunda diferencia importante es que una biblioteca compartida no es simplemente una colección de archivos de objetos, de los cuales el enlazador elige a los que son necesarios para satisfacer referencias indefinidas. En su lugar, los archivos de objetos que componen la biblioteca compartida se combinan en un solo archivo objeto para que un programa que enlaza contra una librería compartida siempre incluye todo el código en la biblioteca, y no sólo aquellas partes que se necesitan.

Para crear una biblioteca compartida, debe compilar los objetos que componen la biblioteca utilizando la opción-fPIC al compilador, así:

$ gcc-c-fPIC test1.c

PIC siglas de código independiente de la posición. Las funciones de una biblioteca compartida se pueden cargar en lugares diferentes en los diferentes programas, por lo que el código en el objeto compartido no deben depender de la dirección (o posición) a la que se carga. Esta consideración no tiene impacto en usted, como programador, excepto que hay que acordarse de usar el indicador-fPIC al compilar código que se utiliza en una biblioteca compartida.
Luego se combinan los archivos de objetos en una biblioteca compartida, como esto:

$ gcc-shared-fPIC-o libtest.so test1.o test2.o />

Una solución a este problema es utilizar la opción-Wl,-rpath al vincular el programa. Suponiendo que se utiliza esto:

$ gcc-o aplicación app.o-L. -Ltest-Wl,-rpath, / usr / local / lib

A continuación, cuando se ejecuta, el sistema buscará cualquier / usr / bibliotecas locales / lib aplicaciones compartidas requeridas.

carga dinámica y Descarga:

Esta funcionalidad está disponible en Linux mediante el uso de la función dlopen. Usted puede abrir una biblioteca compartida denominada libtest.so llamando dlopen así:

dlopen (libtest.so, RTLD_LAZY) />
(El segundo parámetro es una bandera que indica cómo para unir los símbolos en la biblioteca compartida. Puede consultar las páginas del manual en línea para dlopen si quieres más información, pero RTLD_LAZY suele ser la opción que desee.) Para utilizar la carga funciones dinámicas, incluya el archivo de cabecera y el enlace con la opción ldl para recoger el bibliotecario libdl y.
El valor de retorno de esta función es un void * que se utiliza como un identificador para el library.You compartida puede pasar este valor a la dlsym funcionar para obtener la dirección de una función que se ha cargado con la biblioteca compartida. Por ejemplo, si libtest.so define una función llamada mi_funcion, se le puede llamar así:

void * mango = dlopen (libtest.so, RTLD_LAZY);
void (* test) () = dlsym (manejar, mi_funcion);
(* test) ();
dlclose (mango);

La llamada al sistema dlsym también se puede utilizar para obtener un puntero a una variable estática en la biblioteca compartida.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *