මොනෝ ඉන්ද්‍රජාලික වන්නේ කෙසේද?


153

මම C # ඉගෙන ගන්නවා, ඒ නිසා මම කුඩා C # වැඩසටහනක් සාදා Hello, World!, පසුව එය සම්පාදනය කර එය සමඟ mono-cscධාවනය කළෙමි mono:

$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!

මම ගැටීමෙන් බව දැක TABතුළ bash, Hello.exeක්රියාත්මක සලකුණු කරන ලදී. ඇත්ත වශයෙන්ම, එය ක්‍රියාත්මක වන්නේ ගොනු නාමය පටවන කවචයකින් පමණි!

Hello.exeනොවන අපූරු ගොනු දිගුව සමග ELF ගොනුව:

$ 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එයින් අදහස් වන්නේ එය මයික්‍රොසොෆ්ට් වින්ඩෝස් සංඛ්‍යාත්මකව සම්බන්ධ කළ හැකි ක්‍රියාත්මක කළ හැකි බවයි. එය වින්ඩෝස් පෙට්ටියකට දමන්න, එවිට එය ක්‍රියාත්මක විය යුතුය.

මම ඇත wineස්ථාපනය, නමුත් wine, වින්ඩෝස් යෙදුම් සඳහා ගැළපෙන තට්ටුව වීම, ක්රියාත්මක කිරීමට දීර්ඝ කාලයක් 5x පමණ කාලයක් ගතවේ Hello.exeලෙස monoඑය නොවේ නම්, එය සෘජුවම කරන්න ක්රියාත්මක wineක් එය.

මම හිතන්නේ monoකර්නල් මොඩියුලයක් ස්ථාපනය කර monoඇති අතර එය execසිස්කල් / එස් වලට බාධා කරයි , නැතහොත් ආරම්භ වන ද්විමය ග්‍රහණයන් අල්ලා ගනී 4D 5A, නමුත් lsmod | grep monoමිතුරන් දෝෂයක් ඇති කරයි.

මෙහි සිදුවන්නේ කුමක්ද, මෙම ක්‍රියාත්මක කළ හැකි විශේෂ බව කර්නලය දැන ගන්නේ කෙසේද?


සාක්ෂි සඳහා එය මගේ ෂෙල් වැඩ කරන මැජික් නොවේ, මම එය ක්‍රියාත්මක කිරීම සඳහා ක්‍රැප් ෂෙල් (අකා sh) භාවිතා කළ අතර එය තවමත් දේශීයව ක්‍රියාත්මක වේ.


විචාරකයෙකු කුතුහලයෙන් සිටි බැවින් මෙන්න වැඩසටහන සම්පුර්ණයෙන්ම:

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");
  }
}

4
ඔබට පිළිතුර ලැබුනද, මම ටිකක් ව්‍යාකූල වී සිටිමි, ඔබ ජාවා වැනි විධානයන් ක්‍රියාත්මක කරන්නේ නම් php hello.phpහෝ python hello.pyහෝ ක්‍රියාත්මක කළහොත් ඒවා ක්‍රියාත්මක වන්නේ ඒවා ක්‍රියාත්මක කළ නොහැකි නමුත් වැඩසටහනක් කියවා ක්‍රියාත්මක කරන ගොනුවකි. කෙසේ වෙතත් ඔබ වෙනුවට ඔබ ධාවනය කරන්නේ නම් මම ඔබේ ප්‍රශ්නය සොයාගෙන පිළිගත් පිළිතුර වඩාත් සාධාරණයි (එය අනිවාර්යයෙන්ම binfmt-support භාවිතා කරයි.perl hello.pljava hello./hello.exemono hello.exe
kuldeep.kamboj

ul kuldeep.kamboj ඔබ කියන දේ මට තේරෙන බව මට විශ්වාස නැත, නමුත් වින්ඩෝස් ක්‍රියාත්මක කළ හැකි ලිනක්ස් පෙට්ටියක “ස්වදේශීයව” ධාවනය වීම ගැන මම පුදුමයට පත් වීමි.
පූසා

1
ඇත්ත වශයෙන්ම මම පැවසූ දෙය නම් ඕනෑම කේත ගොනුවක් (හෝ සම්පාදනය කරන ලද ගොනුවක්) එහි වැඩසටහන හරහා ආකෘතියෙන් ක්‍රියාත්මක කළ හැකි අතර program codefile, ඔබේ නඩුවේ වැඩසටහන මොනෝ වන අතර මගේ උදාහරණවලට php, python, perl සහ java ඇතුළත් වේ. කේතය හරහා තවමත් ක්‍රියාත්මක වන .exe ගොනුව හැර වෙනත් දිගුවකට මොනෝ ඉඩ ලබා දෙන්නේදැයි මම සැක කරමි. අවසානයේ මෙය සම්පාදිත කේතයක් ක්‍රියාත්මක කරන බැවින් එය කවුළු මත රඳා නොපවතී. කෙසේ වෙතත් ඔබේ මූලාශ්‍ර ගොනුවට වින්ඩෝස් පමණක් ඒපීඅයි වැනි යැපෙන කේතයක් තිබේ නම් පැහැදිලිවම එම exe ගොනුව ක්‍රියාත්මක කිරීම සඳහා ඔබට වයින් අවශ්‍ය විය යුතුය.
kuldeep.kamboj

4
මෙහි ඇති අපූරු උත්ප්‍රාසයෙහි කොටසක් නම් /etc/magicහෝ /usr/share/file/magic(හෝ ඒ හා සමාන ඉන්ද්‍රජාලික පිහිටීම) මෙය කිරීමට අවශ්‍ය තොරතුරු අඩංගු ගොනුවයි.

1
එය ඉතා රසවත් ගොනුවක් ලෙස සටහන් කරන්න (මා කැමති ගොනුවක් තිබේ නම් එය මගේ පළමු තේරීම වනු ඇත). සියලු වර්ගවල ලිපිගොනු හඳුනා ගැනීම සඳහා තොරතුරු එහි ඇත. නමුත් ගොනුව ක්‍රියාත්මක කරන්නේ කෙසේදැයි සොයා ගැනීමට පෙර ඔබ මුලින්ම එය කුමක්දැයි හඳුනාගත යුතුය. ගොනුව සහ එහි මැජික් කරන්නේ එයයි. ඒ හා සමාන දෙයක් - ජාවා ද්විමය කර්නල් ලිනක්ස් සඳහා ටික කලකට පෙර සිට ඔබට ඒ $ foo.jarවෙනුවට කළ හැකි දේ $ java -jar foo.jar- මොනෝ සඳහා කරන දෙයට සමාන ය.

Answers:


189

මෙය ක්‍රියාත්මක වන්නේ binfmt_misc ය: එය කර්නලයට නොදන්නා ද්විමයන් ක්‍රියාත්මක කරන්නේ කෙසේදැයි පැවසීමට ඉඩ දෙයි. අන්තර්ගතය දෙස බලන්න /proc/sys/fs/binfmt_misc; ඔබ එහි දකින ලිපිගොනු අතර, මොනෝ ද්විමය ධාවනය කරන්නේ කෙසේදැයි යමෙක් පැහැදිලි කළ යුතුය:

enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a

(ඩේබියන් පද්ධතියක). MZ( 4d5a) වලින් ආරම්භ වන ද්විමය ලබා දිය යුතු බව මෙය කර්නලයට කියයි run-detectors. ද්විමය ධාවනය සඳහා මොනෝ හෝ වයින් භාවිතා කළ යුතු දැයි දෙවැන්න සොයා ගනී.

ද්විමය වර්ග ඕනෑම වේලාවක එකතු කළ හැකිය, ඉවත් කළ හැකිය, සක්‍රීය කළ හැකිය. විස්තර සඳහා ඉහත ප්‍රලේඛනය බලන්න (අර්ථ නිරූපණය පුදුම සහගතය, මෙහි භාවිතා කරන අථත්‍ය ගොනු පද්ධතිය මුළුමනින්ම සම්මත ගොනු පද්ධතියක් මෙන් ක්‍රියා නොකරයි). /proc/sys/fs/binfmt_misc/statusගෝලීය තත්වය ලබා දෙන අතර සෑම ද්විමය “විස්තර කරන්නෙකු” එහි තනි තත්වය පෙන්වයි. අක්‍රීය කිරීමේ තවත් ක්‍රමයක් binfmt_miscනම්, එහි කර්නල් මොඩියුලය මොඩියුලයක් ලෙස ගොඩනගා ඇත්නම් එය මුදා හැරීමයි; මෙය මුළුමනින්ම වළක්වා ගැනීම සඳහා එය අසාදු ලේඛණගත කළ හැකි බවද මෙයින් අදහස් වේ.

මෙම අංගය මඟින් MZ ක්‍රියාත්මක කළ හැකි (වින්ඩෝස් PE සහ PE + ද්විමය, නමුත් ඩොස් සහ ඕඑස් / 2 ද්විමය!), ජාවා ජාර් ලිපිගොනු වැනි නව ද්විමය වර්ග සඳහා සහය දැක්වීමට ඉඩ දෙයි ... එය දන්නා ද්විමය වර්ග සඳහා සහය දැක්වීමට ඉඩ දෙයි. නව ගෘහ නිර්මාණ, සාමාන්‍යයෙන් Qemu භාවිතා කිරීම; මේ අනුව, සුදුසු පුස්තකාල සමඟ, ඔබට ඉන්ටෙල් ප්‍රොසෙසරයක් මත ARM ලිනක්ස් ද්විමය විනිවිදභාවයෙන් ධාවනය කළ හැකිය!

.NET අර්ථයෙන් වුවද, ඔබේ ප්‍රශ්නය හරස් සම්පාදනයෙන් පැනනැඟී ඇති අතර, එමඟින් මෙය අවවාදයක් ගෙන එයි binfmt_misc: හරස් සම්පාදිත ද්විමයන් ක්‍රියාත්මක කළ හැකි පද්ධතියක් මත හරස් සම්පාදනය කිරීමට ඔබ උත්සාහ කරන විට සමහර වින්‍යාස පිටපත් වැරදි ලෙස ක්‍රියා කරයි. සාමාන්‍යයෙන්, හරස් සම්පාදනය හඳුනා ගැනීම යනු ද්විමය ගොඩනැගීම සහ එය ක්‍රියාත්මක කිරීමට උත්සාහ කිරීම ය. එය ක්‍රියාත්මක වන්නේ නම්, ඔබ හරස් සම්පාදනය නොකරයි, එසේ නොවේ නම්, ඔබ (හෝ ඔබේ සම්පාදකයා කැඩී ඇත). autoconfසාමාන්‍යයෙන් මෙම අවස්ථාවේ දී ස්ක්‍රිප්ට් සවි කළ හැක්කේ ගොඩනංවන සහ සත්කාරක ගෘහ නිර්මාණ ශිල්පය පැහැදිලිව සඳහන් කිරීමෙන් ය, නමුත් සමහර විට ඔබට binfmt_miscතාවකාලිකව අක්‍රිය කිරීමට සිදුවනු ඇත ...


2
/ Proc ගැන කුතුහලයක් ඇති අයට, ඔබ / proc / * වැඩ කරන්නේ කෙසේද යන්න ගැන උනන්දු විය හැකිය. සුපිරි පරිශීලකයා මත .
සීවීඑන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.