C # öğreniyorum, bu yüzden şunu Hello, World!
derleyen mono-csc
ve koşturan küçük bir C # programı hazırladım mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Ben vurduğunda fark TAB
içinde bash
, Hello.exe
çalıştırılabilir kutlandı. Nitekim, sadece dosya ismini yükleyen bir kabuk ile çalışır!
Hello.exe
olduğu değil komik bir dosya uzantısına sahip bir ELF dosyası:
$ 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
Microsoft Windows statik bağlantılı çalıştırılabilir anlamına gelir. Bunu bir Windows kutusuna bırakın, çalışacaktır.
Ben var wine
yükledim ancak wine
Windows uygulamaları için bir uyumluluk katmanı olan, yaklaşık 5x sürece çalıştırmak için gereken Hello.exe
olarak mono
ve doğrudan do yürütülmesi, bu yüzden değil wine
o kadar çalışır.
Bununla mono
yüklü olan bazı çekirdek modüllerinin var olduğunu varsayıyorum mono
, exec
sistem çağrılarını / sistemlerini engelliyor ya da başlayan ikilileri yakalar 4D 5A
, ancak lsmod | grep mono
arkadaşlar bir hata döndürür.
Burada neler oluyor ve çekirdek bu yürütülebilir dosyanın özel olduğunu nasıl biliyor ?
Sadece benim kabuğumun büyüsü olmadığını ispatlamak için Crap Shell'i (aka sh
) çalıştırmak için kullandım ve hala doğal olarak çalışıyor.
İşte programın tamamı, yorum yapanların merak ettiği için:
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
programında, mono olarak program aracılığıyla yürütülebilmektedir , benim örneklerimde php, python, perl ve java bulunur. Mono'nun .exe dosyası dışındaki uzantılara hala kod yoluyla çalıştırıldığından şüpheleniyorum. Derlenmiş bir kod yürütüldüğü için pencerelere hiç bağlı olmamalıdır. Ancak kaynak dosyanız yalnızca Windows API gibi bazı bağımlı kodlara sahipse, o zaman açıkça bu exe dosyasını çalıştırmak için şarap gerekir.
/etc/magic
da /usr/share/file/magic
(veya benzer bir büyülü konum) bunu yapabilmek için gerekli bilgiyi içeren dosyadır.
$ foo.jar
tercih edebilir $ java -jar foo.jar
- mono için yapılanlara benzer.
php hello.php
yapython hello.py
daperl hello.pl
ya da java gibi derlenmiş bir dil durumundajava hello
çalıştırırsanız, orada çalıştırılabilir olmadıklarından, bir dosyayı okuyup çalıştırdıklarından da çalıştırırlar. Ancak./hello.exe
bunun yerinemono hello.exe
koşturursanız sorunuzu buldum ve cevabı daha makul buldum (bu durumda kesinlikle binfmt-support kullanın.