En informática , un código ejecutable , un archivo ejecutable o un programa ejecutable , a veces denominado simplemente ejecutable o binario , hace que una computadora "realice tareas indicadas de acuerdo con instrucciones codificadas ", [2] a diferencia de un archivo de datos que debe ser interpretado ( analizado ) por un intérprete para que sea funcional. [3]
La interpretación exacta depende del uso. Tradicionalmente, "Instrucciones" se refiere a instrucciones de código de máquina para una CPU física . [4] En algunos contextos, un archivo que contiene instrucciones de script (como bytecode ) también puede considerarse ejecutable.
Los archivos ejecutables se pueden codificar manualmente en lenguaje de máquina, aunque es mucho más conveniente desarrollar software como código fuente en un lenguaje de alto nivel que pueda ser fácilmente comprendido por humanos. En algunos casos, el código fuente se puede especificar en lenguaje ensamblador , que sigue siendo legible para humanos y, al mismo tiempo, está estrechamente asociado con las instrucciones del código de máquina.
El lenguaje de alto nivel se compila en un archivo de código de máquina ejecutable o en un código de máquina no ejecutable (un archivo objeto de algún tipo); el proceso equivalente en el código fuente del lenguaje ensamblador se denomina ensamblaje ). Se vinculan varios archivos objeto para crear el ejecutable. Los archivos objeto (ejecutables o no) normalmente se almacenan en un formato contenedor , como Executable and Linkable Format (ELF) o Portable Executable (PE), que es específico del sistema operativo . [5] Esto da estructura al código de máquina generado, por ejemplo, dividiéndolo en secciones como .text (código ejecutable), .data (variables globales y estáticas inicializadas) y .rodata (datos de solo lectura, como constantes y cadenas).
Los archivos ejecutables normalmente también incluyen un sistema de tiempo de ejecución , que implementa características del lenguaje de tiempo de ejecución (como la programación de tareas , el manejo de excepciones , la llamada a constructores y destructores estáticos, etc.) e interacciones con el sistema operativo, en particular el paso de argumentos, el entorno y la devolución de un estado de salida , junto con otras características de inicio y apagado, como la liberación de recursos como los identificadores de archivos . Para C, esto se hace vinculando el objeto crt0 , que contiene el punto de entrada real y realiza la configuración y el apagado llamando a la biblioteca de tiempo de ejecución . [6]
Por lo tanto, los archivos ejecutables normalmente contienen un código de máquina adicional significativo además del generado directamente a partir del código fuente específico. En algunos casos, es deseable omitir esto, por ejemplo, para el desarrollo de sistemas integrados, o simplemente para comprender cómo funcionan la compilación, el enlace y la carga. En C, esto se puede hacer omitiendo el entorno de ejecución habitual y, en su lugar, especificando explícitamente un script de enlace, que genera el punto de entrada y maneja el inicio y el apagado, como la llamada main
a start y la devolución del estado de salida al núcleo al final. [7]
Para que un sistema (como un sistema operativo , un firmware [ cita requerida ] o un cargador de arranque ) pueda ejecutar un archivo ejecutable, debe cumplir con la interfaz binaria de aplicación (ABI) del sistema. En interfaces simples, un archivo se ejecuta cargándolo en la memoria y saltando al inicio del espacio de direcciones y ejecutándose desde allí. [8] En interfaces más complicadas, los archivos ejecutables tienen metadatos adicionales que especifican un punto de entrada independiente . Por ejemplo, en ELF, el punto de entrada se define en el e_entry
campo del encabezado, que especifica la dirección de memoria (virtual) en la que se debe iniciar la ejecución. [9] En la Colección de compiladores GNU , este campo lo establece el enlazador en función del _start
símbolo. [10]