Vinculación dinámica de Linux frente a vinculación estática (biblioteca dinámica y biblioteca estática)

Primero, el concepto básico de la biblioteca:

Existe una gran cantidad de bibliotecas tanto en la plataforma Windows como en la plataforma Linux. Esencialmente, una biblioteca es una forma binaria de código ejecutable que se puede cargar en la memoria para que el sistema operativo la ejecute. Debido a la naturaleza diferente de Windows y Linux, los binarios de las dos bibliotecas son incompatibles. En términos simples, los archivos de objetos de estas funciones de uso común se agrupan para proporcionar la interfaz de la función correspondiente, lo cual es conveniente para los programadores. Cuando se utiliza la función, solo se necesita el archivo de encabezado correspondiente al paquete. Según el uso de la biblioteca, se puede dividir en biblioteca dinámica y biblioteca estática, y los sufijos correspondientes son diferentes en diferentes plataformas.

En WINDOWS: .dll sufijo es biblioteca dinámica, .lib sufijo es biblioteca estática;

En LINUX: .so sufijo es biblioteca dinámica, .a sufijo es biblioteca estática

Dos, biblioteca estática y enlace estático

      <1> Biblioteca estática:

       La biblioteca estática puede considerarse simplemente como un conjunto de archivos de destino, es decir, archivos formados al comprimir y empaquetar muchos archivos de destino. Por ejemplo, en nuestra programación diaria, si necesita usar la función printf, necesita el paquete de archivos de biblioteca stdio.h. Cuando usa strlen, necesita el paquete de archivos de biblioteca string.h, pero si compila el código fuente de la función correspondiente directamente. El archivo se nos proporciona directamente, lo que causará grandes inconvenientes a nuestra administración y uso, por lo que podemos usar el programa de compresión "ar" para comprimir estos archivos de destino juntos para formar el archivo de biblioteca estática libx.a. 

       Nota: El formato de nomenclatura de la biblioteca estática: lib + "nombre de biblioteca" + .a (sufijo) Ejemplo: libadd.a es una biblioteca estática llamada add

     <2> Enlace estático:

      Para las bibliotecas estáticas, cuando el programa se compila y se vincula, el código de la biblioteca se vincula al archivo ejecutable y la biblioteca estática ya no es necesaria cuando se ejecuta el programa. En el proceso de uso, solo necesitamos vincular la biblioteca y los archivos compilados de nuestro programa para formar un archivo ejecutable.

     Nota: Para obtener detalles sobre las bibliotecas estáticas y los enlaces estáticos, consulte el Capítulo 4 de "Cultivo automático de enlaces, carga y bibliotecas de programadores"

A través de un ejemplo para comprender cómo compilar y vincular nuestro propio archivo de encabezado y código al mismo tiempo, y finalmente generar un archivo ejecutable:

/////main.c/////

#include <stdio.h>
#include "add.h"

int main()
{
    int ret = add(3, 4);
    printf("3 + 4 = %d\n",ret);

    return 0;
}

/////add.c/////

#include "add.h"

int add( int x, int y)
{   
    return x + y;
}


/////add.h/////

#pragma once
#include <stdio.h>

int add( int x, int y);

/////Makefile/////

main : main.c libadd.a
    gcc main.c -L . -ladd -o main
    //-L为指定路径 .为当前目录下 -l+库名字,编译器可在指定目录下自己寻找名为add的库文件

libadd.a : 
    gcc -c add.c -o add.o

    //ar -rc将多个编译后的文件打包为一个静态库文件
    ar -rc libadd.a add.o

.PHONY:clean
clean:
    rm main libadd.a

Captura de pantalla de salida después de hacer:

Escriba una descripción de la imagen aquí

<3> Desventajas:

1. Desperdicio de memoria y espacio en disco: el método de enlace estático es muy serio para el desperdicio de memoria de computadora y espacio en disco. Si el tamaño de una biblioteca estática en el lenguaje C es de 1 MB, hay 100 archivos en el sistema que necesitan usar el archivo de la biblioteca. Si se usa un enlace estático, se desperdiciarán 100 M de memoria. Si el número es mayor, el desperdicio será mayor. Por ejemplo, la siguiente figura: Tanto el programa 1 como el programa 2 deben usar Lib.o. Si se usa un enlace estático, entonces dos copias de este archivo se almacenarán en la memoria física .

Escriba una descripción de la imagen aquí

2. Problema de actualización: por ejemplo, 20 módulos de un programa, cada módulo tiene solo 1 MB, luego, cada vez que actualice un módulo, el usuario debe volver a descargar el programa 20M.

Tres, biblioteca dinámica y enlace dinámico

     <1> Biblioteca dinámica: el programa solo vincula el código de la biblioteca dinámica cuando el programa se está ejecutando, y varios programas comparten el código de la biblioteca. Un archivo ejecutable vinculado con una biblioteca dinámica contiene solo una lista de las direcciones de entrada de funciones que utiliza, en lugar del código de máquina completo del archivo de objeto donde se encuentra la función externa.

     Nota: El formato de nomenclatura de la biblioteca dinámica: lib + "nombre de biblioteca" + .so (sufijo) Ejemplo: libadd.so es una biblioteca dinámica llamada agregar
    enlace dinámico <2>: debido al enlace estático desperdicia memoria y dificultad para actualizar módulos, etc. Enlace dinámico propuesto. La idea de implementación básica es dividir el programa en partes relativamente independientes de acuerdo con los módulos, y vincularlos para formar un programa completo cuando el programa se está ejecutando, en lugar de vincular todos los módulos del programa en un solo Ejecuta el archivo. Entonces, la vinculación dinámica es retrasar el proceso de vinculación al tiempo de ejecución.

    De manera similar, si hay tres archivos: el programa 1, el programa 2 y Lib.o, el programa 1 y el programa 2 deben usar el archivo Lib.o al ejecutarlo. Al ejecutar el programa 1, el sistema primero carga el programa 1, cuando se descubre que necesita Cuando el archivo Lib.o también se carga en la memoria, vaya a cargar el programa 2 Cuando descubra que también necesita usar el archivo Lib.o, no necesita volver a cargar Lib.o, simplemente vincule el programa 2 y el archivo Lib.o Simplemente levántese, siempre hay un solo archivo Lib.o en la memoria.
Escriba una descripción de la imagen aquí

> Nota: Para obtener más información sobre las bibliotecas dinámicas y los enlaces dinámicos, consulte el Capítulo 7 de "Autocultivación, carga y bibliotecas del programador".

La biblioteca dinámica y los ejemplos de enlaces dinámicos todavía usan el código anterior, y el resultado es el mismo. Lo único que debe cambiarse es el Makefile.

/////Makefile/////
main : main.c libadd.so
    gcc main.c -L . -ladd -o main

libadd.so : 
    gcc -fPIC -shared add.c -o libadd.so
    //-shared表示输出结果是共享库类型的  -fPIC表示使用地址无关代码奇数来生产输出文件

.PHONY:clean
clean:
    rm main libadd.so

Nota: <1> Después de generar el archivo ejecutable, podemos usar el comando ldd para ver la biblioteca dinámica de la que depende el archivo ejecutable.

Escriba una descripción de la imagen aquí

<2> Como se mencionó anteriormente, los sufijos de los archivos de la biblioteca en Windows y Linux son diferentes. La razón más fundamental es que los formatos de los dos archivos son diferentes. Puede verificar el tipo de archivo de la biblioteca dinámica en Linux a través del archivo, una biblioteca dinámica está en formato ELF. Los archivos ELF de enlace dinámico se denominan Objetos dinámicos compartidos (DSO, Objetos dinámicos compartidos), denominados objetos compartidos; en Windows, los archivos de enlace dinámico se denominan Biblioteca de enlace dinámico (Biblioteca de enlace dinámico), que es el nombre completo del sufijo de archivo .dll
< 3> Ventajas: ① Sin duda, ahorra memoria; edReduce el intercambio y el intercambio de páginas físicas; ;Cuando la actualización de un módulo, en teoría, solo necesita sobrescribir el archivo de destino anterior correspondiente. La nueva versión del archivo de destino se cargará automáticamente en la memoria y se vinculará; ④ Cuando el programa se está ejecutando, puede elegir dinámicamente cargar varios módulos de programa para lograr la expansión del programa.

Publicado 25 artículos originales · elogiado 8 · 20,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/boazheng/article/details/104358850
Recomendado
Clasificación