Colección de citas famosas - Consulta de diccionarios - Un programa C de microcontrolador 51 contiene un archivo bin, que debe contener varias funciones importantes que se pueden usar para abrirlo.

Un programa C de microcontrolador 51 contiene un archivo bin, que debe contener varias funciones importantes que se pueden usar para abrirlo.

Por lo general, esto no se puede abrir. Abrirlo equivale a robar el código de otra persona.

archivo lib

Significado:

Las bibliotecas se pueden dividir en bibliotecas estáticas y bibliotecas dinámicas.

Uso:

Los archivos Lib solo se pueden usar mediante compilación, y la compilación se divide en estática y dinámica.

Estático:

La biblioteca estática coloca tanto la declaración de exportación como la implementación en la biblioteca. Después de la compilación, todo el código se integra en el programa anfitrión.

Dinámico:

La biblioteca dinámica equivale a un archivo H, que es la declaración de la parte exportada (archivo .dll). Después de la compilación, solo necesita compilar la parte de la declaración de exportación en el programa host, y se requiere el archivo dll correspondiente para admitirlo en tiempo de ejecución.

Descripción detallada:

Los archivos Lib no están abiertos al público, por lo que no se pueden ver los archivos compilados.

Hay varias opciones:

1. Si ve el archivo dll con el mismo nombre, puede ver la interfaz dll a través del depende que viene con vc.

2. Verifique el nombre de la función contenida en la biblioteca que está utilizando a través de msdn y busque su archivo de encabezado correspondiente. El archivo de encabezado contiene la declaración de función de toda la biblioteca (puede estar incompleta).

3. Verifique el directorio src en vc u otros directorios de instalación de herramientas para ver el código de la función.

El archivo Lib es un archivo binario, por lo que para ver su contenido sólo puedes desmontarlo.

Al usar lenguajes de programación, hay tres formas de abrir archivos lib:

1. Usar el nombre de ruta completo en el módulo de objeto/biblioteca. Poner * . En el directorio Lib de VC.

3. Modifique la configuración del proyecto vinculado -> Agregue la ruta de la biblioteca a la entrada y agréguela a su directorio.

El archivo LIB es un archivo de biblioteca (similar a un archivo DLL), al que otros programas pueden llamar y no se puede abrir directamente.

Contenido

El archivo lib es una colección de archivos obj. Por supuesto, hay otra información auxiliar mezclada para permitir que el compilador encuentre con precisión el archivo obj correspondiente. Podemos operar archivos lib a través de tlib.exe (directorio raíz en TC 2.0). Puede usar el comando tlib para agregar el archivo obj que generó a un archivo lib, eliminar el archivo obj en el archivo lib y extraer el archivo obj interno. Una vez que comprenda la estructura general de los archivos lib y sus operaciones específicas, tendrá otro punto de entrada para estudiar la implementación específica del lenguaje C en el proceso de aprendizaje del lenguaje C.

Pasos de uso

Bajo comando, configure el directorio actual en el directorio donde se encuentra tlib.exe, luego ingrese el comando tlib y presione la tecla Intro. En este momento, el contenido mostrado es una explicación detallada del comando tlib. La sintaxis es la siguiente:

Sintaxis: comando TLIB libname [/C] [/E], lista de archivos

<. p>ruta del archivo de la biblioteca libname Nombre

El orden de las operaciones que realizará el comando (opcional)

El nombre del archivo de lista (opcional)

La forma del comando es la siguiente: ltsymbol gtmodulename, donde ltsymbol gt es:

Agregar nombre de módulo a la biblioteca

- Eliminar nombre de módulo de la biblioteca

* Extraer nombre del módulo sin eliminarlo

-o-reemplazar el nombre del módulo en la biblioteca

-*o*-extraer el nombre del módulo y eliminarlo

/Biblioteca que distingue entre mayúsculas y minúsculas

/Ecreate Diccionario extendido

Explicación detallada:

comando tlib libname [/C] [/E], lista de archivos

/C: case -bandera sensible.

Esta opción no se usa comúnmente y este parámetro es opcional.

/E: Crea un diccionario extendido. La creación de un diccionario extendido puede acelerar el proceso de vinculación de archivos de biblioteca de gran tamaño. Este parámetro también es opcional.

Comando de operación (opcional):

nombre de archivo obj agrega el archivo obj especificado al archivo lib.

-obj filename elimina el archivo obj especificado del archivo lib.

* El nombre del archivo obj exporta el archivo obj especificado (el archivo obj correspondiente todavía existe en el archivo lib después de la exportación).

- El nombre del archivo obj reemplaza el archivo obj especificado (siempre que haya un obj con el mismo nombre que el archivo obj especificado en el archivo lib).

-* nombre de archivo obj exporta el archivo obj especificado (elimine el archivo obj correspondiente del archivo lib después de la exportación).

Lista de archivos obj en el archivo lib (opcional)

Este parámetro describe el nombre del archivo de lista del archivo lib correspondiente generado después de ejecutar el comando. Registra la lista de archivos obj en el archivo lib actual.

El método de edición es diferente de dll

(1) Se requiere lib al compilar y dll al ejecutar.

Si desea completar la compilación del código fuente, lib es suficiente.

Si aún deseas que se ejecuten programas vinculados dinámicamente, una dll es suficiente.

En las fases de desarrollo y depuración, por supuesto es mejor tener ambas.

(2)Los programas de biblioteca dinámica generales incluyen archivos lib y archivos dll. Los archivos lib deben estar conectados a la aplicación en tiempo de compilación, mientras que los archivos dll se llamarán en tiempo de ejecución. Si hay un archivo dll, el archivo lib correspondiente generalmente es información de índice, implementada en el archivo dll. Si solo hay un archivo lib, entonces este archivo lib se compila estáticamente y el índice y la implementación están en él. Una ventaja de los archivos lib compilados estáticamente es que no requieren bibliotecas dinámicas cuando se instalan para los usuarios. Pero también hay algunas desventajas, es decir, la aplicación es relativamente grande y se pierde la flexibilidad de la biblioteca dinámica. Cuando se actualiza una versión, se deben lanzar nuevas aplicaciones al mismo tiempo.

(3) En el caso de las bibliotecas dinámicas, hay dos archivos, uno es el archivo de la biblioteca de importación (.lib) y el otro es el archivo DLL. El archivo de biblioteca de importación contiene los nombres y ubicaciones de las funciones exportadas por la DLL, que contiene las funciones y datos reales. La aplicación utiliza el archivo lib para vincularse a los archivos DLL requeridos y las funciones y datos de la biblioteca no se copian al archivo ejecutable. Por lo tanto, en el archivo ejecutable de la aplicación lo que se almacena no es el código de la función llamada, sino la dirección de memoria de la función a llamar en la DLL. De esta forma, cuando se están ejecutando una o más aplicaciones, se ejecuta el programa. El código es el mismo que la función llamada. Los códigos de función están vinculados entre sí, lo que ahorra recursos de memoria. Como se puede ver en la descripción anterior, el archivo DLL debe distribuirse junto con la aplicación; de lo contrario, la aplicación generará errores.

Edición del método de carga

Unirse directamente

Abra la página de visualización de archivos en VC, seleccione el nombre del proyecto, haga clic derecho y seleccione "Agregar archivos al proyecto". " Menú, seleccione el archivo LIB en el cuadro de diálogo de archivo emergente para agregar la DLL.

Crear

Abra el menú "Configuración del proyecto" del proyecto, seleccione "Enlace" y luego ingrese el archivo LIB de la DLL en el cuadro de texto debajo de "Módulo Objeto/Biblioteca". ".

Código de programa

La ventaja de agregar una directiva de precompilación #pragma comment (LIB, "*.lib") es que se pueden vincular diferentes versiones de archivos lib a través de directivas de precompilación condicional. Porque, en el modo de depuración, el archivo LIB generado es la versión de depuración, como Regd.lib. En el modo de lanzamiento, el archivo LIB generado es la versión de lanzamiento, como Regr.lib.

Cuando se carga la aplicación; el archivo DLL LIB, también debe incluir el archivo de encabezado (*.h) correspondiente a la DLL, que proporciona el prototipo de función definido en la DLL y luego lo declara.

Comentarios detallados

Edición conceptual de secciones

Solo hay cuatro tipos de secciones en formato Lib, a saber, Primera Sec, Segunda Sec, Longname Sec y objsecSecond Sec. y Longname Sec es una parte opcional y no se encuentra en muchos archivos Lib. El comienzo de Singatur es solo una bandera, que es equivalente al número mágico en el archivo objeto COFF. Es una cadena de longitud 8 con el valor "! ltarch gt\n .

La primera sección, como sugiere el nombre, es la primera sección. Contiene los nombres de todos los símbolos de la biblioteca y los nombres de estos símbolos en la biblioteca La posición (desplazamiento absoluto) del archivo de destino ubicado en

El segundo segundo es el mismo que el primer segundo. La diferencia es que el segundo segundo es una lista ordenada. Es mucho más rápido encontrar símbolos en la biblioteca que a través del primero.

Longname Sec es una tabla de cadenas que contiene todos los nombres de archivos de objetos largos. El nombre del archivo de objeto correspondiente no se proporciona en Obj Sec a continuación. búsquelo en esta sección.

Obj Sec son las partes del archivo objeto. Estas partes almacenan los datos sin procesar de diferentes archivos objeto. p>

En el archivo de la biblioteca, cada sección tiene dos partes. es el encabezado y el otro son los datos de esta sección; el encabezado describe el tipo y la longitud de los datos en la sección. El formato del encabezado es el mismo. Su estructura se describe en lenguaje C de la siguiente manera:

.

estructura typedef {

Nombre del personaje[16]; // nombre

hora de carga[12] //hora

char ID de usuario[6] ; //ID de usuario

char GroupID[6]; //ID de grupo

Modo de carga[8] //Modo

Tamaño de carácter[10] ; //Longitud

char end of header[2]; //Terminator

} SectionHeader

Como puede ver, todos los datos del encabezado son La ventaja de usar cadenas es que puede mejorar la compatibilidad del formato, porque la disposición de los datos en diferentes máquinas es diferente en modo little-endian, y algunas funcionan en modo big-endian, que son incompatibles entre sí. otro (¿¡la diferencia entre los dos modos!? Consulte mi artículo "Formato COFF", que se explica en la primera parte del documento. No habrá tal problema (lo encontraremos más adelante), pero también tiene algunos inconvenientes). , es decir, necesita convertir la cadena en un valor numérico, lo cual es un paso adicional.

En esta estructura, los tres miembros más utilizados son el nombre, el tamaño y el encabezado final. ¡El nombre es el nombre del festival! El tamaño también es fácil de entender, que es la longitud de los datos en esta sección. Su contenido es "`\n" (tenga en cuenta que no hay errores tipográficos aquí, es "`". y "\ n" dos caracteres). ¿Cómo te va últimamente? Un poco extraño, ¿verdad? ¿Por qué existe este terminador? La longitud del encabezado de cada segmento también se conoce. No puedo leerlo en orden. La respuesta es: ¡No! Porque hay un espacio entre cada párrafo. Si tiene cero bytes, simplemente léelo en orden. Para saber si está fuera de lugar. terminador para localizarlo. Si encuentra que el terminador está incorrecto al leer el encabezado, debe leer byte por byte hasta encontrar el terminador, que se considera alineado. ¡recordar! ¡recordar!

Por supuesto, no existe tal problema al leer datos a través de un desplazamiento determinado en el primer o segundo segundo. No habrá desalineación, ¡así que siéntete libre de leerlo!

La primera segunda

La primera parte suele ser todas las partes de la Lib. Su nombre es "/".

La estructura de su parte de datos es la siguiente:

estructura typedef {

Núm de símbolo largo sin firmar // El número de símbolos en la biblioteca

Long sin signo; símbolo offset[ n] //Desplazamiento de la parte de destino donde se encuentra el símbolo

char StrTable[m] //Tabla de cadenas de nombres de símbolos

} FirstSec

El primer miembro SymbolNum es el número de símbolos. ¡estar en posición de firme! Se almacena en modo Big-Endian (los datos en la plataforma x86 se almacenan en modo Little-Endian. Preste atención a la conversión aquí. La función de conversión que se proporciona más adelante puede convertir entre formato little-endian y formato big-endian).

El segundo miembro SymbolOffset es una matriz y la longitud n es el número de símbolos, que es SymbolNum. Esta matriz almacena el desplazamiento de cada símbolo en la sección de destino. A través de él podemos encontrar fácilmente el archivo objeto donde se encuentra el símbolo. ¡estar en posición de firme! También se almacena en formato big endian.

El tercer miembro StrTable es una tabla de cadenas y su longitud m es el valor de SectionHeader. Tamaño menos (SymbolNum 1)*4. Su estructura es muy simple, solo una cadena que termina en '\0' (igual que la estructura de la tabla de cadenas en el archivo COFF). En algunos sistemas, también puede ser una colección de cadenas que terminan en "/\n".

Esta es una estructura simple, pero las longitudes de los dos miembros no están definidas. ¡Todos deben pensar en cómo leer fácilmente estos datos de Lib! A continuación solo proporciono una función que convierte Little-Endian a Big-Endian.

Inline void convert(void * p //Puntero a los datos que se van a convertir.

, size_tsize = 4 //Longitud de los datos, largo es 4, corto es 2.

p>

) {

char * buf =(char *)p;

Temperatura de carbonización;

for(size _ t I = 0; iltsize/2;i) {

temp = buf[I];

buf[I]= buf[tamaño-I-1];

buf[size-I-1]= temp;

}

}

Segundo segundo

Segunda parte

p>

¡Esta sección es muy similar a la primera sección! Suele ser la segunda parte del archivo Lib. Su nombre también es "/" (Nota: la primera parte llamada "/" en el archivo es la primera parte y la segunda parte es la segunda parte). Sin embargo, su estructura es algo diferente de la primera parte, como se muestra a continuación:

estructura typedef {

Unsigned long ObjNum//El número de objetos

Unsigned Long integer obj offset[x]; //El desplazamiento de cada objeto en segundos

Símbolo largo sin signo num; //El número de símbolos en la biblioteca

Símbolo corto sin signo dx[ n]; Índice del símbolo en la tabla ObjOffset

char StrTable[m]; //tabla de cadenas de nombre del símbolo

} SecondSec

El primero Miembro ObjNum es el número de Obj Sec en la biblioteca.

El segundo miembro ObjOffset es una tabla de compensaciones que registra las compensaciones de todos los Obj Secs en la biblioteca. El número de registro x de esta tabla es ObjNum.

El tercer miembro SymbolNum tiene el mismo significado que SymbolNum en el primer segundo.

El cuarto miembro SymbolIdx se convierte en un índice, que registra la posición de la cadena de nombre correspondiente en la tabla ObjOffset.

Tenemos que indexar dos veces para encontrar la ubicación segura para objetos del símbolo que queremos. Su número de artículo n es SymbolNum. Sin embargo, tenga en cuenta que este índice es un corto sin firmar, no un largo sin firmar.

El quinto miembro StrTable tiene la misma estructura que el primer Sec. Sin embargo, su longitud m es el valor de SectionHeader. Tamaño menos ((objnum 1)* 4 (símbolo num 2)* 2).

Cabe señalar que todos los datos aquí están en formato Little-Endian. ¡No te equivoques! Nombre largo Segundos

Esta sección es una tabla de cadenas, el nombre es "//", la estructura es la misma que FirstSec.StrTable, por lo que no entraré en detalles aquí.

Segundos del objeto

Los datos de esta sección son los datos originales del archivo COFF. Léelo en voz alta y guárdalo como un archivo, que es un archivo COFF. Para conocer su formato, consulte el artículo Formato COFF.

Cabe señalar que su método de denominación es algo especial. Si el nombre del archivo Obj tiene menos de 16 caracteres, se guardará en el miembro Nombre del encabezado de sección y terminará con el carácter "/". Si no se puede guardar en el nombre del miembro, el primer carácter del nombre del miembro es '/', seguido del desplazamiento del nombre en Longname Sec.

Por ejemplo:

! ltarch gt\n

……

Segundos de nombre largo:

This_Is_Long_Name0001\0

This_Is_Long_Name0002\0

……

Obj Sec1:

Nombre[16]: "nombre corto/"

……

Objeto Sec2: p>

nombre[16]: "/0 "/Aquí se utiliza el primer nombre de archivo largo This_Is_Long_Name0001.

......

La tercera parte del objeto:

nombre[16]: "/22 "//El segundo nombre largo del archivo This_Is_Long_Name0002 se utiliza aquí.