La tercera práctica de la base cero integrada

Utilice gcc para generar una biblioteca estática y una biblioteca dinámica .so

Ejemplo 1: Escriba tres archivos, incluido el archivo de encabezado de definición de función hello.h, el archivo de contenido c de función hello.c y el archivo c main.c del programa principal para realizar pruebas.
El procedimiento es:

 hello.h: 
 #ifndef HELLO_H 
 #define HELLO_H 
 void hello(const char*name); 
 #endif//HELLO_H
 
hello.c:
#include<stdio.h> 
void hello(const char*name)
 {
    
     printf("Hello%s!\n",name); }

main.c:
include"hello.h" 
   int main()
    {
    
     
    hello("everyone"); 
    return 0;
     } 
     程序作用是调用hello输出Hello everyone

Primero, use el editor de archivos para editar tres archivos:
Inserte la descripción de la imagen aquí
Segundo, tanto las bibliotecas estáticas como las bibliotecas dinámicas son creadas por archivos .o. Por lo tanto, primero debemos compilar el programa fuente hello.c en un archivo .o a través de gcc:
Inserte la descripción de la imagen aquí
3. Cree una biblioteca estática a partir del archivo .o y escriba el siguiente comando en el indicador del sistema para crear el archivo de biblioteca estática libmyhello.a :
Inserte la descripción de la imagen aquí
4. En el programa Use la biblioteca estática en:
Inserte la descripción de la imagen aquí
5. Verifique si la función pública hola está realmente conectada al archivo de destino hola, elimine la biblioteca estática y pruebe si el programa se ejecuta normalmente:
Inserte la descripción de la imagen aquí
Después de eliminar la biblioteca estática, el El programa se ejecuta normalmente, lo que indica que la función interna se ha conectado al código de destino.
6. Cree una biblioteca dinámica con hello.o, escriba el siguiente comando en el indicador del sistema para obtener el archivo de biblioteca dinámica libmyhello.so:
Inserte la descripción de la imagen aquí
7. Utilice la biblioteca dinámica en el programa, copie el archivo libmyhello.so en el directorio / usr / lib, de lo contrario Al llamar a la biblioteca dinámica, el sistema no encontrará este archivo, llamará y generará el archivo ejecutable hello2 y ejecutará:
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Nota: El archivo de la biblioteca dinámica se copia en el directorio lib del usuario y el archivo de la biblioteca dinámica debe mantenerse en el directorio original; de lo contrario, el sistema no encontrará la biblioteca dinámica, lo que provocará un error de compilación.

La generación y el uso de archivos de biblioteca estáticos .ay .so en Linux

1. Etapa de preparación; crea cuatro archivos, respectivamente

A1.c:
#include <stdio.h>
 void print1(int arg)
 {
    
     printf("A1 print arg:%d\n",arg); }
 
A2.c:
#include <stdio.h>
void print2(char *arg)
{
    
     printf("A2 printf arg:%s\n", arg); }

A.h:
#ifndef A_H 
#define A_H 
void print1(int); 
void print2(char *); 
#endif

test.c:
#include <stdlib.h> 
#include "A.h" 
int main()
{
    
     print1(1); 
print2("test"); 
exit(0); }

2. Generación de biblioteca estática: la biblioteca estática es generada por el archivo .o, por lo que primero compile el archivo c para convertirlo en el archivo .o:
Inserte la descripción de la imagen aquí
3. Luego, genere una biblioteca estática llamada libafile.a a partir de dos archivos .o
Inserte la descripción de la imagen aquí
. Llamar a la biblioteca El archivo se compila y luego se ejecuta.
Inserte la descripción de la imagen aquí
5. La generación del archivo .so de la biblioteca compartida: la biblioteca dinámica también se genera en función del archivo .o, por lo que primero compile el archivo c para convertirlo en el archivo .o:
Inserte la descripción de la imagen aquí
6 Genere la biblioteca dinámica basada en el archivo .o:
Inserte la descripción de la imagen aquí
después de generar la biblioteca dinámica La biblioteca debe copiarse en la biblioteca del usuario, de lo contrario, el sistema no puede encontrar la biblioteca y no se puede llamar.

7. Utilice el archivo de biblioteca .so para crear un programa ejecutable:
Inserte la descripción de la imagen aquí

Ejercicios independientes sobre la generación y uso de bibliotecas estáticas.

Tema: Además de la función x2x, expanda y escriba una función x2y (función autodefinida), el código de la función principal llamará a x2x y x2y; escriba estas 3 funciones en 3 archivos .c separados y use gcc para compilarlas en 3 Un archivo de objeto .o; use la herramienta ar para generar un archivo de biblioteca estática .a a partir de los archivos de objeto x2x y x2y, y luego use gcc para vincular el archivo de objeto de la función principal con este archivo de biblioteca estática para generar el ejecutable final programa
. Escribe tres programas principales:
Inserte la descripción de la imagen aquí
2. Los archivos de compilación para generar archivos .o:
Inserte la descripción de la imagen aquí
3. generar archivos de biblioteca estática basada en x2x.o y x2y.o:
Inserte la descripción de la imagen aquí

Cuarto, llame al archivo estático para conectar mian.c para generar un archivo ejecutable y ejecute:
Inserte la descripción de la imagen aquí

Ejercicios independientes sobre la generación y uso de bibliotecas dinámicas.

1. Realice ejercicios de biblioteca dinámica sobre la base de los ejercicios de biblioteca estática anteriores y también genere bibliotecas dinámicas basadas en archivos .o:
Inserte la descripción de la imagen aquí
2. Copie la biblioteca dinámica en el directorio lib del usuario:

Inserte la descripción de la imagen aquí
3. Llame al archivo estático para conectar mian.c para generar un archivo ejecutable y ejecute:
Inserte la descripción de la imagen aquí

Comandos de uso común de GCC

1. El proceso de compilación detallado de gcc, preprocesamiento:
Inserte la descripción de la imagen aquí
2. Compilación en código ensamblador:
Inserte la descripción de la imagen aquí
3. Ensamblaje:
Inserte la descripción de la imagen aquí
4. Vinculación y ejecución:
Inserte la descripción de la imagen aquí
5. Compilación de varios archivos de programa:

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

Seis, conexión de archivos de biblioteca

gcc –c –I /usr/dev/mysql/include test.c –o test.o
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

Siete, use la biblioteca de enlaces estáticos cuando los enlaces sean obligatorios

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

Uso común de ensamblado GCC y archivos Binutils y ELF

1. Después del preprocesamiento, algunos campos del archivo .i:
Inserte la descripción de la imagen aquí
2. Algunos campos en el archivo .s después de compilar el archivo:
Inserte la descripción de la imagen aquí
3. Use el comando as en Binutils para ensamblar:
Inserte la descripción de la imagen aquí
4. Vínculo:
1. Use la biblioteca dinámica para vincular :
Inserte la descripción de la imagen aquí

2. Utilice una biblioteca estática para la vinculación:
Inserte la descripción de la imagen aquí
A través de la comparación, se encuentra que el archivo ELF generado tiene un espacio de gran tamaño debido a las dos formas de conexión diferentes, lo que demuestra que la dinámica ahorra más espacio que la estática.
5. Vea la información de cada parte del archivo ELF:
Inserte la descripción de la imagen aquí
6. Desmonte el ELF:

objdump -D hello 

Inserte la descripción de la imagen aquí

Comparación del uso del comando nasm y el tamaño del archivo ejecutable generado

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Obviamente, comparando el tamaño del archivo ejecutable, se encuentra que el archivo ejecutable generado al compilar con el comando nasm es mucho más pequeño.

Las principales funciones de las maldiciones, escribe los nombres y funciones de varias funciones básicas.

Curses funciona en pantallas, ventanas y subventanas. La pantalla es el área de visualización total disponible del dispositivo (para el terminal, todas las posiciones de caracteres disponibles en la ventana) y la ventana está relacionada con rutinas específicas. Como la ventana stdscr básica, etc.

关于屏幕的常用部分代码:
int addch(const chtype char_to_add);//当前位置添加字符
int addchstr(chtype *const string_to_add);//当前位置添加字符串

int printw(char *format, ...);//类似与printf
int refresh(void);//刷新物理屏幕
int box(WINDOW *win_ptr, chtype vertical, chtype horizontal);
//围绕窗口绘制方框,用vertical绘制垂直边,用horizontal绘制水平边

int insch(chtype char_to_insert);   //插入一个字符(已有字符后移)

Experimente BBS en el sistema win10

En el sistema win10, "Panel de control" -> "Programas" -> "Habilitar o cerrar funciones de Windows", habilite "cliente telnet" y "Subsistema de Windows para Linux". Luego abra una ventana de línea de comando cmd e ingrese telnet bbs.newsmth.net en la línea de comando
Inserte la descripción de la imagen aquí

Instale la biblioteca de curses y la ubicación de instalación de los archivos de encabezado y los archivos de biblioteca

安装代码:
sudo apt-get install libncurses5-dev 

Inserte la descripción de la imagen aquí

Utilice gcc para compilar y generar un juego de terminal y ejecutarlo (juego de serpientes).

Escriba el código fuente de Snake, gcc compila y ejecuta el archivo ejecutable:
Inserte la descripción de la imagen aquí

para resumir

Este experimento es muy importante para comenzar con una comprensión preliminar de las bibliotecas estáticas y las bibliotecas dinámicas. En la creación y el uso de bibliotecas estáticas y bibliotecas dinámicas, tengo un conocimiento profundo de la diferencia entre bibliotecas estáticas y bibliotecas dinámicas, y la diferencia entre las condiciones de trabajo de los dos. La estructura básica y el principio de funcionamiento de los archivos de biblioteca tienen más comprensión, especialmente el proceso de ensamblaje de programas ejecutables. En el proceso de exploración, puede sentir claramente que la dificultad radica en que la biblioteca dinámica debe habilitar permisos de administrador al copiar, y el directorio original También debe existir una biblioteca dinámica en. Además, entiendo el formato de archivo ELF, el formato de lenguaje ensamblador y las herramientas para trabajar con gcc en la compilación. También hay un experimento de ejecución de distribución en tiempo de compilación de gcc, que me brindó nuevos conocimientos sobre el principio de funcionamiento de gcc.

Supongo que te gusta

Origin blog.csdn.net/rude_dragon/article/details/109045771
Recomendado
Clasificación