¿Alguna vez pensó por qué los programas tienen diferentes archivos de configuración para Windows, Mac y Linux? Para darle una idea, le contaré los diferentes tipos de formatos en los que viene un ejecutable. No entraré en detalles, pero la próxima vez que use el comando file, sabrá exactamente lo que estará mirando.
Aquí está la salida del comando file en un ejecutable aleatorio en mi máquina.
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, not stripped
Repasemos cada palabra una por una.
ELF
ELF (Executable and Linkable Format) es un formato de archivo para ejecutables, código objeto, bibliotecas compartidas y volcados de núcleo. Es el formato de archivo estándar para sistemas Unix y similares a Unix (por ejemplo, Linux). En su mayoría, encontrará este tipo de archivos en sus máquinas Linux.
Otro:
Mach-O
(Mach object) –para NeXTSTEP, OS X e iOS
PE
(Portable Executable): para el sistema operativo Windows
32-bit
El sistema de arquitectura de computadora de 32 bits es el que usa el conjunto de instrucciones de ensamblaje x86, MIPS32.
Otro:
Los sistemas de 64 bits utilizan el conjunto de instrucciones de ensamblaje x86-64.
Tenga en cuenta que esto no le informa sobre el sistema en el que está trabajando, sino sobre la forma en que las instrucciones se han estructurado y escrito en el binario (por lo tanto, para el mismo programa, 32 bits y 64 bits tendrán instrucciones de ensamblaje diferentes, pero el ejecutable se comportaría de la misma manera).
Hay otros conjuntos de instrucciones, como MIPS32, MIPS64, ARM, PowerPC que puede encontrar, pero en mi experiencia, x86 y x86-64 son los más utilizados.
LSB
Linux Standard Base (LSB) es un proyecto conjunto de varias distribuciones de Linux bajo la estructura organizativa de Linux Foundation para estandarizar la estructura del sistema de software. Básicamente, esto significa que en diferentes sistemas operativos basados en Linux (Ubuntu, Fedora, etc.), se usarían reglas comunes para compilar información en el binario (por ejemplo, usar algunas bibliotecas estándar para tareas específicas, estandarizar el diseño de la jerarquía del sistema de archivos, etc.) .
Intel 80386
Intel 80386 es un microprocesador de 32 bits de Intel. Esto significa que el ejecutable se puede ejecutar en el microprocesador 80386 de Intel o en cualquier dispositivo compatible con él. Los últimos microprocesadores de 64 bits son compatibles con los de 32 bits.
SYSV
SYSV es la abreviatura de System Five. Es una de las primeras versiones comerciales del sistema operativo Unix desarrollado por AT&T. La otra versión principal de Unix es BSD (Distribución de software de Berkely)
Otro:
GNU/Linux: es muy obvio que esto se refiere al sistema operativo Linux.
Dynamically linked (uses shared libs)
En la sección de dinamically linked (vinculación dinámica), los nombres de las bibliotecas externas (shared libraries) se colocan en el archivo ejecutable final, mientras que la vinculación real tiene lugar en tiempo de ejecución cuando tanto el archivo ejecutable como las bibliotecas se colocan en la memoria. Por lo tanto, no tenemos que mantener las bibliotecas estándar dentro del binario (usted las importa en su programa). Esto ayuda a mantener el tamaño del archivo bajo y también permite que varios programas utilicen una sola copia de un módulo ejecutable.
Otro:
En la vinculación estática, todos los módulos de la biblioteca utilizados en el programa se copian en la imagen ejecutable final. Esto lo realiza el enlazador y se realiza como último paso del proceso de compilación. Esto, naturalmente, aumenta mucho el tamaño del archivo.
Tenga en cuenta que los programas que utilizan bibliotecas vinculadas estáticamente suelen ser más rápidos que los que utilizan bibliotecas compartidas. También en los programas vinculados estáticamente, todo el código está contenido en un único módulo ejecutable. Por lo tanto, nunca se encuentran con problemas de compatibilidad.
interpreter /lib/ld-linux.so.2
Este es el intérprete de ELF. Es responsable de la vinculación dinámica.
for GNU/Linux 2.6.32
2.6.32 representa la versión del kernel de Linux, y la biblioteca C vinculada con los objetivos del programa.
not stripped
Los binarios non stripped (no eliminados) contienen información de depuración. Esta información es una representación de la relación entre el programa ejecutable y el código fuente original. Incluye cosas como nombres de variables globales y estáticas y nombres de funciones.
Por otro lado, los binarios stripped carecen de esta información de depuración.
Fuente: akashtrehan.com
0 comentarios