¿Qué es un ejecutable portátil (PE)?


Mejor respuesta

Ejecutable portátil

El formato Portable Executable es un formato de archivo para ejecutables, código objeto, DLL, archivos de fuentes FON y otros que se utilizan en las versiones de 32 y 64 bits de los sistemas operativos Windows. El formato PE es una estructura de datos que encapsula la información necesaria para que el cargador del sistema operativo Windows administre el código ejecutable empaquetado.

Esto incluye referencias de bibliotecas dinámicas para vincular, exportar e importar tablas de API, datos de administración de recursos e hilo -Datos de almacenamiento local (TLS). En los sistemas operativos NT, el formato PE se utiliza para EXE, DLL, SYS (controlador de dispositivo) y otros tipos de archivos. La especificación de Interfaz de firmware extensible (EFI) establece que PE es el formato ejecutable estándar en entornos EFI.

Respuesta

La portabilidad del código fuente C significa que, siempre que su plataforma de destino deseada tiene un compilador de C funcional disponible, puede mover su código fuente de C a esa plataforma de destino volviéndolo a compilar, sin tener que modificarlo. Debido a que casi todas las plataformas de destino tienen un compilador de C disponible, C se considera un lenguaje de programación muy portátil.

Dicho esto, simplemente escribir código en C no garantiza la portabilidad. Debe ejercer disciplina para evitar escribir código que no sea portátil. Por ejemplo, escribir código que haga cualquiera de las siguientes cosas resultará en un código no portátil:

  • Hace suposiciones sobre los tamaños de cualquier tipo de datos, que no sea char.
  • Hace suposiciones sobre cómo se alinean los datos en la memoria y dentro de las estructuras.
  • Hace suposiciones sobre cómo se empaquetan / rellenan los datos dentro de las estructuras.
  • Hace suposiciones sobre el orden de bytes (big endian vs little endian) .
  • Utiliza una extensión de compilador no estándar, que podría no estar disponible en todas las implementaciones de compiladores.
  • Usa una extensión de biblioteca no estándar, que podría no estar disponible en todas las plataformas.
  • Se basa en cualquier comportamiento definido por la implementación, que puede funcionar de manera diferente en una implementación de compilador diferente.
  • Contiene cualquier comportamiento indefinido, que podría parece que funciona en un entorno, pero podría comportarse de forma impredecible en otro entorno.
  • Hace cualquier llamada API (interfaz de programación de aplicaciones) al sistema, que puede no estar disponible en todos los entornos.
  • Hace suposiciones sobre direcciones de memoria específicas (por ejemplo, que una dirección de memoria específica está asignada a un registro de dispositivo de hardware, etc.).
  • Hace suposiciones sobre el tamaño de un puntero, o que un puntero tiene el mismo tamaño que un int.
  • Hace suposiciones sobre cómo se pasan los argumentos (en la pila o en registros específicos).
  • Contiene cualquier código fuente de lenguaje ensamblador en línea.
  • Utiliza una característica más reciente y mejor del lenguaje C que puede que aún no sea compatible con algunas implementaciones del compilador (y, en algunos casos, nunca podría ser compatible).
  • Se basa en una biblioteca que hace cualquiera de las anteriores.

Esta no es una lista exhaustiva.

Si puede Para evitar el uso de código no portátil, lo mejor que puede hacer es aislar ese código no portátil en un archivo fuente separado. Luego, cuando necesite mover el código a una nueva plataforma de destino, está muy claro qué subconjunto del código fuente debe modificarse.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *