La vista previa del archivo de comparación de la biblioteca dinámica de Linux y la biblioteca estática

  

árbol de directorios de archivos es la siguiente, como puede ver, muy simple. 1. libtest /2. | - lt.c 3. | - lt.h 4. `- test.c # lt.c 1. 4. 5. #include 6. 7. void myprint (void) 8. {9. printf (" Linux library test! /n " ); 10.} # lt.h 1. 4. 5. void myprint (void); # test.c 1. 4. 5. #include " lt.h " 6. 7. int main (void) 8. {9. myprint (); 10. return 0; 11.} Primer vistazo a la biblioteca estática que se creó primero en la biblioteca estática liblt.a. 1. $ gcc -o lt.o -c lt.c 2. $ ar cqs liblt.a lt.o De nuevo, enlace, 1. $ gcc test.o liblt.a -o prueba Esta vez para ver su referencia nuevamente Situación de la biblioteca. 1. $ ldd test 2. linux-gate.so.1 => (0xffffe000) 3. libc.so.6 => /lib/libc.so.6 (0xb7e29000) 4. /lib /ld-linux. So.2 (0xb7f6e000) La biblioteca dinámica se convierte en la biblioteca dinámica liblt.so. 1. $ gcc -o lt.o -c lt.c 2. $ gcc -shared -Wall -fPIC -o liblt.so lt.o -shared Esta opción especifica generar una biblioteca de enlaces dinámicos (deje que el conector genere un tipo T de exportación) Las tablas de símbolos, a veces también generan símbolos de exportación de tipo W débilmente conectados, no se pueden conectar sin el programa externo. Equivalente a un archivo ejecutable -fPIC: significa compilar en un código independiente de la posición. Sin esta opción, el código compilado depende de la posición, por lo que la carga dinámica se realiza mediante la copia del código para satisfacer las necesidades de diferentes procesos, pero no El propósito de compartir código real de segmento. -L .: indica que la biblioteca que se va a conectar está en el directorio actual -ltest: El compilador tiene una convención de nomenclatura implícita al buscar la biblioteca de enlace dinámico, es decir, prefijando el nombre dado con lib, seguido de .so para determinar la biblioteca Nombre LD_LIBRARY_PATH: esta variable de entorno indica la ruta en la que el conector dinámico puede cargar la biblioteca dinámica. Método de enlace I, cópielo en la biblioteca del sistema y enlácelo, deje que gcc lo encuentre usted mismo. $ Sudo cp liblt.so /usr /lib 2. $ gcc -o test test.o -llt Aquí podemos ver la opción -llt, - l [lib_name] especifica el nombre de la biblioteca, y buscará activamente lib [lib_name] .so. La ruta a esta búsqueda se puede encontrar en gcc --print-search-dirs. Método de enlace II, especifique manualmente la ruta de la biblioteca 1. $ cc -o test test.o -llt -B /ruta /a /lib La opción -B aquí agrega /ruta /a /lib a la ruta de la búsqueda de gcc. No hay ningún problema con este enlace, pero el programa vinculado manualmente en el Método II aún debe especificar la ruta de la biblioteca (el enlace y la ejecución son independientes). Debe agregar la variable de sistema LD_LIBRARY_PATH: 1. $ export LD_LIBRARY_PATH = /path /to /lib Esta vez para verificar el estado del enlace de la biblioteca del programa de prueba (método I) 1. $ ldd test 2. linux-gate.so.1 =>; (0xffffe000) 3. liblt.so => ​​/usr/lib/liblt.so (0xb7f58000) 4. libc.so.6 => /lib/libc.so.6 (0xb7e28000) 5. /lib /ld -linux.so.2 (0xb7f6f000) Bueno, ¿hay más liblt.so que un programa vinculado estáticamente? Bueno, esta es la mayor diferencia entre estática y dinámica. En el caso estático, carga la biblioteca directamente en el programa. Cuando se vincula dinámicamente, solo mantiene la interfaz y separa la biblioteca dinámica del código del programa. Esto puede mejorar la reutilización del código y reducir el acoplamiento del programa. Además, durante el tiempo de ejecución, para garantizar que el programa principal pueda encontrar la biblioteca dinámica, la biblioteca dinámica generalmente se libera en el directorio del sistema, o en una ruta relativamente fija al programa principal, de modo que no importa cuándo y dónde se ejecute el programa principal en la máquina. Puede encontrar una biblioteca dinámica. Cuando la biblioteca estática solo funciona en enlaces, el archivo de biblioteca estática no existe cuando se ejecuta el programa principal.

Copyright © Conocimiento de Windows All Rights Reserved