মনো কেমন যাদু?


149

আমি সি # শিখছি, তাই আমি একটু সি # প্রোগ্রাম যা বলছেন তৈরি 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, উইন্ডোজ অ্যাপ্লিকেশনগুলির জন্য একটি সামঞ্জস্য স্তর Hello.exeহিসাবে monoএটি চালানোর জন্য এবং সরাসরি এটি সম্পাদন করতে প্রায় 5x সময় লাগে , সুতরাং এটি 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বা perl hello.plবা জাভা মত কম্পাইল ভাষা ক্ষেত্রে java helloতারাও তাদের কোন এক্সিকিউটেবল কিন্তু একটি প্রোগ্রাম পড়া হয় চালানো এবং ফাইল চালানো হবে। তবে আপনি যদি এর ./hello.exeপরিবর্তে mono hello.exeদৌড়েন তবে আমি আপনার প্রশ্নটি পেয়েছি এবং উত্তরটি আরও যুক্তিসঙ্গত বলে মনে করেছি (যা ক্ষেত্রে অবশ্যই বিনফম্যাট-সমর্থন ব্যবহার করে
কুলদীপ.কম্বুজ

@ কুলদীপ.কম্বোজ আমি নিশ্চিত না আপনি কী বলছেন তা আমি বুঝতে পেরেছি কিন্তু আমি কেবল অবাক হয়ে গিয়েছিলাম যে একটি উইন্ডোজ এক্সিকিউটেবল একটি লিনাক্স বাক্সে "নেটিভালি" চালায়।
বিড়াল

1
আসলে আমি যা বলছিলাম যে কোনও কোড ফাইল (বা সংকলিত ফাইল) এর প্রোগ্রামের মাধ্যমে ফর্ম্যাটতে কার্যকর করা যেতে পারে program codefile, আপনার ক্ষেত্রে প্রোগ্রামটি মনো, যখন আমার উদাহরণগুলিতে পিএইচপি, পাইথন, পার্ল এবং জাভা অন্তর্ভুক্ত রয়েছে। আমি সন্দেহ করি যদি মনো থেকে কোডের মাধ্যমে মৃত্যুর পরেও .exe ফাইল ব্যতীত অন্যগুলিতেও এক্সটেনশানটির অনুমতি দেয়। এটি উইন্ডোতে একেবারেই নির্ভর করা উচিত নয় কারণ শেষ পর্যন্ত এটি একটি সংকলিত কোড কার্যকর করে। তবে যদি আপনার উত্স ফাইলটিতে উইন্ডোজ কেবলমাত্র এপিআইয়ের মতো কিছু নির্ভরশীল কোড থাকে তবে অবশ্যই সেই এক্স ফাইলটি চালানোর জন্য আপনার অবশ্যই ওয়াইন দরকার।
কুলদীপ.কম্বুজ

4
এর বিস্ময়কর বিড়ম্বনার অংশটি হ'ল /etc/magicবা /usr/share/file/magic(বা অনুরূপ যাদুকরী অবস্থান) এমন ফাইল যা এতে করতে সক্ষম হওয়ার জন্য প্রয়োজনীয় তথ্য রয়েছে।

1
এটি একটি খুব আকর্ষণীয় ফাইল @ কেট করুন (আমি যদি একটি প্রিয় ফাইল থাকি তবে এটি সম্ভবত আমার প্রথম পছন্দ হবে)। এটিতে সব ধরণের ফাইল সনাক্ত করার তথ্য রয়েছে। ফাইলটি কীভাবে চালানো যায় তা নির্ধারণ করার আগে আপনাকে প্রথমে ফাইলটি কী তা সনাক্ত করতে হবে। ফাইল এবং এর যাদু এটিই করে। অনুরূপ একটি জিনিস - জাভা বাইনারি কার্নেলটি কিছুক্ষণ আগে থেকে লিনাক্সের জন্য সমর্থন করে যা আপনি মনো-এর জন্য যা করা হয় তার থেকে $ foo.jarতুলনায় এটি করতে পারেন $ java -jar foo.jar

উত্তর:


183

এটি 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করার আরেকটি উপায় হ'ল এটির কার্নেল মডিউলটি আনলোড করা, যদি এটি মডিউল হিসাবে নির্মিত হয়; এর অর্থ এটি সম্পূর্ণরূপে এড়াতে এটি কালো তালিকাভুক্ত করাও সম্ভব।

এই বৈশিষ্ট্যটি নতুন বাইনারি ধরণগুলিকে সমর্থন করার অনুমতি দেয় যেমন এমজেড এক্সিকিউটেবল (যার মধ্যে উইন্ডোজ পিই এবং পিই + বাইনারি রয়েছে, তবে ডস এবং ওএস / 2 বাইনারি রয়েছে!), জাভা জেআর ফাইলগুলি ... এটি পরিচিত বাইনারি ধরণের উপর সমর্থন করার অনুমতি দেয় নতুন আর্কিটেকচার, সাধারণত Qemu ব্যবহার করে; সুতরাং, উপযুক্ত গ্রন্থাগারগুলির সাথে, আপনি স্বচ্ছভাবে একটি ইন্টেল প্রসেসরের এআরএম লিনাক্স বাইনারিগুলি চালাতে পারেন!

আপনার প্রশ্নটি .NET অর্থে, যদিও ক্রস-সংকলন থেকে উদ্ভূত হয়েছে এবং এটি একটি সতর্কতা এনেছে binfmt_misc: আপনি যখন ক্রস-সংকলিত বাইনারিগুলি চালাতে পারেন এমন কোনও সিস্টেমে ক্রস-সংকলন করার চেষ্টা করেন তখন কিছু কনফিগারেশন স্ক্রিপ্টগুলি দুর্ব্যবহার করে। সাধারণত, ক্রস সংকলন সনাক্তকরণের মধ্যে একটি বাইনারি তৈরি করা এবং এটি চালানোর চেষ্টা জড়িত; যদি এটি চলে, আপনি ক্রস-সংকলন করছেন না, যদি তা না হয় তবে আপনি (বা আপনার সংকলকটি ভাঙা)। autoconfস্ক্রিপ্টগুলি সাধারণত বিল্ড এবং হোস্ট আর্কিটেকচারের স্পষ্টভাবে নির্দিষ্ট করে এই ক্ষেত্রে স্থির করা যেতে পারে তবে কখনও কখনও আপনাকে binfmt_miscঅস্থায়ীভাবে অক্ষম করতে হবে ...


2
যারা / প্রকল্প সম্পর্কে আগ্রহী তাদের কাছে আপনার আগ্রহী হতে পারে কীভাবে / প্রোক / * কাজ করে? উপর সুপার ইউজার
একটি সিভিএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.