Pregunta ¿Por qué se necesita una especificación de formato binario para los archivos ejecutables?


Entiendo que un sistema operativo como Linux o Windows está escrito en C / C ++ y compilado en una arquitectura determinada (por ejemplo, AMD64) para producir un código de máquina que sea adecuado para esa arquitectura.

Mis preguntas -

  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa Portable Executable Format?
  2. ¿Se puede crear un sistema operativo y un programa que se ejecute en ese sistema operativo sin esta especificación de formato binario?
  3. ¿El formato binario depende de la arquitectura, del sistema operativo o de ambos?
  4. ¿El formato binario es aplicable solo a archivos ejecutables o también se aplica al código del sistema operativo?

0


origen




Respuestas:


Como ya habrás adivinado, los formatos ejecutables contienen más que solo código de máquina. Por ejemplo, pueden:

  • Especifique metadatos para el sistema operativo, p. para qué arquitectura está destinado el ejecutable. Este metadato comprende el encabezamiento del archivo.
  • Especifica el programa diseño en memoria. En sistemas operativos modernos, la mayoría de los archivos ejecutables no se cargan en la memoria en un solo fragmento; por lo general, tienen muchos elementos separados. regiones/secciones/segmentos. Algunos de estos segmentos contendrán código ejecutable. Algunos de ellos contendrán datos inmutables, como cadenas de texto. Algunos de ellos se designarán como memoria grabable, para el (los) montón (s) de programa.

    Los diferentes programas tendrán diferentes requisitos (solicitudes) para los tamaños de estas secciones. Esto está todo especificado en el encabezado.

  • Algunos formatos también te permitirán insertar un firma digital, lo que permite la verificación del origen del binario.


  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa Portable Executable Format?

Las razones son principalmente históricas, y los sistemas operativos tienden a quedarse con su formato existente 'nativo' (o 'predeterminado') a menos que haya una razón de peso para cambiar (como ha sucedido, por ejemplo, desde el formato DOS MZ hasta PE en NT 3.1, y desde .out a ELF en Linux 1.2, y de COFF a ELF en varios Unixes a lo largo de los años).

Cabe señalar que el código subyacente de la máquina depende de la arquitectura de la CPU, pero es diferente (llamadas de sys y bibliotecas vinculadas a un lado) ampliamente portátil entre sistemas operativos. De hecho, Windows y Linux modernos pueden ejecutar ambos formatos ejecutables: los ejecutables ELF se ejecutarán en Windows a través de WSL, y los ejecutables PE se ejecutarán en Linux a través de WINE.

  1. ¿Se puede crear un sistema operativo y un programa que se ejecute en ese sistema operativo sin esta especificación de formato binario?

Volvemos al propósito principal de estos formatos. Sin los metadatos que le dicen al sistema operativo dónde cargar partes del programa, la mayoría de los ejecutables modernos no se pueden ejecutar. Algunos formatos muy antiguos como COM contienen bastante código puro, pero no son particularmente flexibles y han caído en desgracia.

En la práctica, no hay necesidad de que exista un sistema operativo. En el nivel de hardware, suponiendo la existencia de un BIOS (heredado), el BIOS simplemente comenzará a ejecutarse en una ubicación específica en el disco (MBR), que puede ser un código máquina arbitrario que luego toma el control y comienza un sistema operativo o hace cualquier otra cosa que le gusta. (Puede ver el MBR en sí mismo como un formato binario, aunque no está directamente relacionado con el código ejecutable). Sin embargo, el UEFI más moderno especifica un formato ejecutable (PE) más complejo.

  1. ¿La arquitectura de formato binario es dependiente, depende del sistema operativo o ambas cosas?

Depende del formato, realmente. Algunos formatos asumen una arquitectura específica. Otros le permiten seleccionar la arquitectura de una lista de "números mágicos" especificados en el encabezado. Todavía otros son completamente independientes de la arquitectura (por ejemplo, código de bytes Java y .NET / CIL).

De forma similar, el formato generalmente no impone restricciones en el sistema operativo, aunque el sistema operativo tendrá restricciones en cuanto a los formatos que puede reconocer y ejecutar (de forma nativa). Por supuesto, las capas de compatibilidad sobre el sistema operativo central pueden ejecutar otros formatos (por ejemplo, JVM, .NET / CLR, WSL & WINE, etc.) que el sistema operativo central puede no reconocer.

  1. ¿El formato binario es aplicable solo a archivos ejecutables o también se aplica al código del sistema operativo?

Una gran parte de la mayoría de los sistemas operativos modernos es solo una colección de archivos ejecutables "normales". Sin embargo, algunas partes del sistema operativo son "especiales" y no necesariamente usarán el mismo formato que el resto. Por lo general, esto se aplica solo al gestor de arranque y kernel.

Para obtener un ejemplo específico, muy común, el gestor de arranque heredado de BIOS no estar en los formatos ELF o PE utilizados por Linux y Windows. El kernel de Linux generalmente se construye en una Formato derivado de ELF que el gestor de arranque GRUB puede cargar, pero podría estar en un formato diferente para ser compatible con el gestor de arranque utilizado. El kernel de Linux también es compatible EFI Stub modo, que contiene un encabezado PE / COFF mínimo para ser compatible con el arranque directo UEFI.


3





El uso principal del formato es cargar programas en la memoria, lo que se hace por un cargador.

  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa Portable Execution Format?

Respuesta cortés: porque el sistema operativo es diferente y tiene diferentes requisitos. Respuesta personal de Unix: porque a Microsoft le gusta reinventar la rueda (cuadrada).

  1. ¿Se puede crear un sistema operativo y un programa que se ejecute en ese sistema operativo sin esta especificación de formato binario?

Sí, pero solo los muy triviales, un sistema operativo bastante básico que ejecuta programas triviales que no necesitan "reubicarse" y no necesitan vincularse a ningún código externo.

  1. ¿La arquitectura de formato binario es dependiente, depende del sistema operativo o ambas cosas?

Ninguno, el formato ELF se usa con muchos sistemas operativos y arquitecturas.

  1. ¿El formato binario es aplicable solo a archivos ejecutables o también se aplica al código del sistema operativo?

En Linux, el kernel de arranque puede no ser ELF, pero los módulos del kernel usan el formato ELF.


3



"Respuesta personal de Unix: porque a Microsoft le gusta reinventar la rueda (cuadrada)". Es curioso que lo digas, considerando que PE (NT 3.1, ~ 1993) es anterior a ELF (Linux, ~ 1995 migration from a.out). En el mundo moderno, PE es el más cercano a COFF, que también fue utilizado previamente por Unixes. - Bob
Sí, y casi todos se mudaron a ELF (excepto Windows y macOS). - xenoid
Que de ninguna manera es MS reinventando la rueda. La decisión de (no) cambiar a un nuevo formato después lanzamiento es muy diferente de inventar uno nuevo "solo para ser diferente". ¿Pedante? Si probablemente. Pero tu respuesta no es ser muy objetiva allí, en broma o no. - Bob