Estoy aprendiendo C #, así que hice un pequeño programa de C # que dice Hello, World!
, luego lo compilé mono-csc
y lo ejecuté con mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Me di cuenta de que cuando me golpeó TAB
en bash
, Hello.exe
fue marcado como ejecutable. De hecho, se ejecuta solo con un shell que carga el nombre del archivo.
Hello.exe
no es un archivo ELF con una extensión de archivo divertida:
$ readelf -a Hello.exe
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
$ xxd Hello.exe | head -n1
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
MZ
significa que es un ejecutable enlazado estáticamente de Microsoft Windows. Suéltelo en un cuadro de Windows y se ejecutará (debería).
Lo he wine
instalado, pero wine
, al ser una capa de compatibilidad para aplicaciones de Windows, tarda aproximadamente 5 veces más en ejecutarse Hello.exe
que mono
ejecutarlo directamente, por lo wine
que no es que lo ejecute.
Supongo que hay algún mono
módulo de kernel instalado mono
que intercepta exec
syscall / s, o atrapa binarios que comienzan con 4D 5A
, pero lsmod | grep mono
y los amigos devuelven un error.
¿Qué está pasando aquí y cómo sabe el núcleo que este ejecutable es especial?
Solo como prueba de que no es mi magia de shell, utilicé Crap Shell (aka sh
) para ejecutarlo y todavía se ejecuta de forma nativa.
Aquí está el programa completo, ya que un comentarista tenía curiosidad:
using System;
class Hello {
/// <summary>
/// The main entry point for the application
/// </summary>
[STAThread]
public static void Main(string[] args) {
System.Console.Write("Hello, World!\n");
}
}
program codefile
, en su caso, el programa es mono, mientras que mis ejemplos incluyen php, python, perl y java. Sospecho que si mono permite la extensión a otro archivo que no sea .exe aún se ejecuta a través del código. No debería depender en absoluto de Windows, ya que finalmente se ejecuta un código compilado. Sin embargo, si su archivo fuente tiene algún código dependiente, como las API de Windows solamente, entonces obviamente debe necesitar wine para ejecutar ese archivo exe.
/etc/magic
o /usr/share/file/magic
(o una ubicación mágica similar) es el archivo que contiene la información necesaria para poder hacer esto.
$ foo.jar
lugar de hacerlo $ java -jar foo.jar
, similar a lo que se hace para mono.
php hello.php
opython hello.py
operl hello.pl
o en caso de lenguaje compilado como Javajava hello
también se ejecutan como su son no ejecutable allí, pero un programa de lectura y ejecución de archivos. Sin embargo, si ejecuta en./hello.exe
lugar demono hello.exe
la, encontré su pregunta y acepté la respuesta más razonable (que en caso de que definitivamente use binfmt-support.