Sistema Dlopen Linux en C

Sistema Dlopen Linux en C
La función de biblioteca dlopen () es una función muy útil en el idioma C. La función carga la biblioteca en la memoria después de abrir una nueva. Generalmente lo usamos para cargar los símbolos de la biblioteca que se desconocen en el momento de la compilación. Dlopen () es una función que se utiliza en nuestros programas. La biblioteca DL implementa dlopen (), definida en dlfcn.H. Se requieren dos parámetros para la función dlopen: el nombre del archivo de la biblioteca y el indicador. El nombre del archivo es una biblioteca dinámica, y define si las dependencias de la biblioteca se calculan de inmediato. El dlopen () devuelve un "mango" que debe considerarse como un valor opaco y otras operaciones de la biblioteca DL usan esto. Si el intento de cargar no tiene éxito, dlopen () devuelve nulo. Pero el dlopen () devuelve el mismo mango de archivo si carga la misma biblioteca muchas veces.

Mientras utiliza la función dlopen, el compilador no examina los posibles errores, ya que no es consciente de los tipos y prototipos que estamos utilizando. El despliegue de la función dlopen para la carga estándar no parece ser promovida por ella, excepto por algunas situaciones menores. Por cierto, es un enfoque para mejorar la introspección. Cuando el módulo compartido está siendo utilizado actualmente por otro programa, la optimización del diseño de memoria no está particularmente interesada en la carga condicional. La huella de la memoria no aumenta cuando se carga una biblioteca utilizada previamente. Evitar el monitoreo del compilador es peligroso y hace una buena redacción de errores. Además, nos falta la posible optimización del compilador.

Ejemplo 1:

Ahora, considere el siguiente ejemplo para ver la funcionalidad de la función dlopen en el idioma C. En el primer paso, cargamos algunas bibliotecas estándar C. Aquí cargamos la nueva biblioteca "dlfcn.H "que se usa para definir las macros al construir el argumento del modo Dlopen.

Luego, presentamos otra biblioteca dentro de nuestro programa "Gnu/lib-name.H ". Los programas de usuario encuentran los archivos de biblioteca compartidos incluidos con GNU LibC de acuerdo con las macros que define. La biblioteca GNU C ofrece las bibliotecas fundamentales para los sistemas operativos GNU y GNU/Linux, así como una amplia gama de otros sistemas basados ​​en Linux. Después de eso, tenemos la implementación del método principal. Dentro de eso, declaramos el objeto de puntero "mango" con la palabra clave vacía. Declaramos una función de puntero sinuso. Hay otra declaración del objeto del puntero "error" para el manejo de errores.

Después de eso, invocamos la función dlopen dentro del objeto "manejar". El dlopen toma dos argumentos: libm_so y "rtld_lazy". Aquí, "libm_so" es el nombre del archivo de la biblioteca que proporciona funciones matemáticas como funciones trigonométricas. Se requiere esta biblioteca compartida mientras usamos la función SINE. El "rtld_lazy" es otro argumento que llama a la función dlopen. Cuando se hace referencia a un símbolo dado por primera vez, las reubicaciones deben llevarse a cabo en un momento determinado por la implementación.

Dado que un proceso no puede hacer referencia a cada símbolo en un archivo de objeto ejecutable, especificar el RTLD Lazy debería mejorar el rendimiento de las implementaciones que habilitan la vinculación del símbolo dinámico. A continuación, tenemos una condición if-else para el manejo de errores cuando el objeto del mango no puede realizar la función dlopen. Llamamos al dlerror para borrar el error.

La función dlerror () proporciona una cadena de terminación nula que se puede legible por el humano y especifica el informe del error reciente causado por una llamada a una de las llamadas de la API Dlopen desde la última llamada de Dlerror. Luego, arrojamos la función así: "(*void **) (& sine) = dlsym (manejar, pecado)". Como esto es extraño, el casting cumple con ISO C que evita las advertencias del compilador. Empleamos la función DLSYM que obtiene la ruta de un símbolo que se especifica dentro de un módulo de enlace dinámico al que se puede acceder a través de una función dlopen ().

Además, realizamos nuevamente la operación if-else para el error estándar que se genera cuando el dlerror () no es nulo. Luego, tenemos una instrucción printf donde especificamos el valor seno a calcular. En el último paso, cerramos ese objeto compartido invocando el dlclose para el mango devuelto por el dlopen ().

#incluir
#incluir
#incluir
#incluir
En t
Main (int argc, char ** argv)

nulo *mango;
doble (*sine) (doble);
Char *Error;
manejo = dlopen (libm_so, rtld_lazy);
si (!manejar)
fprintf (stderr, "%s \ n", dlerror ());
salida (exit_failure);

dlerror ();
*(void **) (& sine) = dlsym (mango, "sin");
if ((error = dlerror ()) != Nulo)
fprintf (stderr, "%s \ n", error);
salida (exit_failure);

printf ("%f \ n", (*sine) (4.0));
dlClose (mango);
salir (exit_success);

Utilizamos la opción -ldl con el comando de compilación C ya que esta es la biblioteca para la interfaz vinculada dlopen y es necesario. Cuando se realiza la ejecución del archivo dlopen, muestra el valor sino del valor previamente dado.

Ejemplo 2:

Ahora, tomamos otro ejemplo de usar la función dlopen. Cargamos nuestro programa con todas las bibliotecas C requeridas para la implementación del código DLOPEN. Luego, comenzamos nuestro programa dentro del método principal. Aquí, definimos la cadena con la declaración de la variable "SRC". Luego declaramos las variables del puntero "strlen", "manejar" y "error".

A continuación, llamamos a la variable de identificación e implementamos la función dlopen. La función dlopen entrela la biblioteca compartida "liberts.Entonces "para las funciones de manejo de cadenas y la bandera" rtld_lazy "que ya se demostró en el ejemplo anterior. Invocamos la función dlerror dentro de la variable "error" para borrar el error generado por la función dlopen. El if-else se utiliza para examinar los errores.

Luego, obtenemos la dirección de la función strlen utilizando la función dlsym y verificamos los errores al hacer esto. Después de esto, usamos la función printf para llamar a la función strnlen para devolver la longitud de la cadena dada. Al final, cerramos la biblioteca compartida con la función dlclose.

#incluir
#incluir
#incluir
#incluir
int main (nulo)

char* src = "Hola Linux";
int ( *strlen) (const char *);
nulo *mango;
Char *Error;
manejo = dlopen ("./libstr.Entonces ", rtld_lazy);
error = dlerror ();
si(!manejar || error != Null) printf ("El intento de la biblioteca de carga falló!\ n%s \ n ", error);
return -1;
strlen = dlsym (mango, "strlen");
error = dlerror ();
si(!strlen || error == null) printf ("%s \ n", error); return -1;
printf ("La longitud de la cadena es:%d \ n", strlen (src));
dlClose (mango);
regresar 0;

Usamos el siguiente comando para la ejecución del programa dado. Aquí, el indicador -lstr se usa para la función de longitud de cadena y el LDL se usa para el archivo de biblioteca dlopen. El programa compilado proporciona la longitud de la cadena como se muestra en el shell:

Conclusión

Se proporciona la información sobre la función Dlopen del lenguaje C en este artículo. Tenemos una breve introducción de la función Dlopen. Luego, implementamos dos ejemplos. La función devuelve un identificador que define la biblioteca abierta. Las direcciones de las funciones dentro de la biblioteca abierta se determinan utilizando este identificador y la función DLSYM. La dirección de una función dentro de una biblioteca que ya se ha abierto usando Dlopen se puede encontrar utilizando la función DLSYM.