বাইনারিগুলি কি বিভিন্ন সিপিইউ আর্কিটেকচার জুড়ে বহনযোগ্য?


16

আমার লক্ষ্য এম্বেডড লিনাক্সের জন্য বিকাশ করতে সক্ষম হওয়া। এআরএম ব্যবহার করে খালি-ধাতব এম্বেড হওয়া সিস্টেমে আমার অভিজ্ঞতা আছে।

বিভিন্ন সিপিইউ টার্গেটের জন্য বিকাশ সম্পর্কে আমার কিছু সাধারণ প্রশ্ন রয়েছে। আমার প্রশ্নগুলি নীচে রয়েছে:

  1. যদি আমার কাছে ' x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz ' চালানোর জন্য একটি অ্যাপ্লিকেশন সংকলিত থাকে তবে আমি কি অন্য সিস্টেমে ' এআরএম টার্গেট, লিনাক্স ওএস সংস্করণ xyz ' তে একই সংকলিত বাইনারি চালাতে পারি ?

  2. যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে পুনরায় বিল্ডিং / পুনরায় সংকলনের জন্য অ্যাপ্লিকেশন উত্স কোড পাওয়া 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি'?

  3. একইভাবে, যদি আমার কাছে একটি লোডযোগ্যযোগ্য কার্নেল মডিউল (ডিভাইস ড্রাইভার) থাকে যা ' x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz ' তে কাজ করে , আমি কি অন্য সিস্টেমে ' এআরএম টার্গেট, লিনাক্স ওএস সংস্করণ xyz ' তে একই সংকলিত .ko লোড / ব্যবহার করতে পারি ? ?

  4. যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় হ'ল প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি' ব্যবহার করে পুনর্নির্মাণ / পুনরায় কম্পাইল করার জন্য ড্রাইভার উত্স কোডটি পাওয়া?


27
না, হ্যাঁ, না, হ্যাঁ
3:30 অপরাহ্নে hobbs

7
এটি উপলব্ধি করতে সহায়তা করে যে আমাদের কাছে কোনও এএমডি লক্ষ্য এবং একটি ইন্টেল লক্ষ্য নেই, উভয়ের জন্য কেবল একটি একক x86 লক্ষ্য। এজন্য যে ইনটেল এবং এএমডি যথেষ্ট সামঞ্জস্যপূর্ণ। এরপরে এটি স্পষ্ট হয়ে ওঠে যে এআরএম টার্গেট নির্দিষ্ট কারণে উপস্থিত রয়েছে, কারণ এআরএম সিপিইউগুলি ইন্টেল / এএমডি / এক্স 86 এর সাথে সামঞ্জস্যপূর্ণ নয়।
এমসাল্টার

1
না, যদি না এটি বাইটা কোড জাভা রানটাইমের মতো পোর্টেবল রানটাইম পরিবেশে চালানোর জন্য তৈরি করা হয়। আপনি যদি এম্বেড ব্যবহারের জন্য কোড লিখছেন, আপনার কোডটি সম্ভবত নিম্ন-স্তরের প্রসেসর-নির্দিষ্ট অপ্টিমাইজেশন বা বৈশিষ্ট্যগুলির উপর নির্ভর করবে এবং পোর্ট করা খুব কঠিন হবে, লক্ষ্য প্ল্যাটফর্মের জন্য কেবল সংকলনের চেয়ে বেশি প্রয়োজন (যেমন অ্যাসেম্বলি কোড পরিবর্তন, সম্ভবত পুনর্লিখন) বেশ কয়েকটি মডিউল বা পুরো প্রোগ্রাম)।
বিডব্লুড্রাকো

1
@ এসএমএলটারস: আসলে আমাদের একটি এএমডি টার্গেট রয়েছে: এএমডি 64 যা প্রায়শই x86-64 লেবেলযুক্ত থাকে (যখন x86 সাধারণত আই 386 এর পুনরায় লেবেলিং হয়)। ভাগ্যক্রমে ইন্টেল এএমডি আর্কিটেকচারটি অনুলিপি করেছে (এবং পরে প্রসারিত হয়েছে) সুতরাং যে কোনও 64 বিট x86 এমডি 64 বাইনারি চালাতে পারে।
slebetman

উত্তর:


42

নং বাইনারিগুলি অবশ্যই লক্ষ্য আর্কিটেকচারের জন্য (পুনরায়) সংকলন করতে হবে এবং লিনাক্স বাক্সের বাইরে ফ্যাট বাইনারিগুলির মতো কিছুই সরবরাহ করে না । কারণটি কারণ একটি নির্দিষ্ট আর্কিটেকচারের জন্য কোডটি মেশিন কোডে সংকলিত হয় এবং বেশিরভাগ প্রসেসর পরিবারের মধ্যে মেশিন কোডটি খুব আলাদা (উদাহরণস্বরূপ এআরএম এবং x86 খুব আলাদা)।

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

মনে রাখবেন যে আপনি এখনও পুরানো সিপিইউ-তে নতুন নির্দেশাবলীর সাথে সংকলিত বাইনারিগুলি ব্যবহার করতে পারবেন না, এমনকি সামঞ্জস্যতা মোডেও (উদাহরণস্বরূপ, আপনি নেহালেম x86 প্রসেসরের 32-বিট বাইনারিতে AVX ব্যবহার করতে পারবেন না ; সিপিইউ কেবল এটি সমর্থন করে না।

নোট করুন যে কার্নেল মডিউলগুলি প্রাসঙ্গিক আর্কিটেকচারের জন্য সংকলন করতে হবে; এছাড়াও, 32-বিট কার্নেল মডিউলগুলি 64-বিট কার্নেল বা তদ্বিপরীতগুলিতে কাজ করবে না।

ক্রস-সংকলন বাইনারি সম্পর্কিত তথ্যের জন্য (যাতে আপনার লক্ষ্য টিআরএম ডিভাইসে কোনও সরঞ্জামচেন থাকতে হবে না), নীচে গ্রাচমালের বিস্তৃত উত্তর দেখুন।


1
X86 এবং x64 এর মধ্যে কোনও সামঞ্জস্যতা (বা এর অভাব) সম্পর্কে স্পষ্ট করে বলা মূল্যবান হতে পারে যে কিছু x86 বাইনারি x64 প্ল্যাটফর্মে চালাতে পারে। (আমি লিনাক্সের ক্ষেত্রে এটির বিষয়টি নিশ্চিত নই, তবে এটি উইন্ডোজে রয়েছে, উদাহরণস্বরূপ)
jpmc26

4
@ jpmc26 এটি লিনাক্সে সম্ভব; তবে আপনার প্রথমে সামঞ্জস্য লাইব্রেরি ইনস্টল করতে হবে। x86 সমর্থন উইন 64 ইনস্টলগুলির একটি অ-alচ্ছিক অংশ। লিনাক্সে এটি alচ্ছিক; এবং যেহেতু লিনাক্স বিশ্বের আরও অনেক দূরত সমস্ত কিছুর bit৪ বিট সংস্করণ উপলব্ধ করার সাথে সাথে কিছু ডিস্ট্রো ডিফল্ট নয় (সমস্ত?) 32 বিট লাইব্রেরি ইনস্টল করা আছে। (এটি কতটা সাধারণ তা আমি নিশ্চিত নই; তবে এর আগে মূলধারার ডিস্ট্রোস চালানো লোকদের কাছ থেকে এ সম্পর্কে কয়েকটি প্রশ্ন দেখেছি))
ড্যান ইজ ফিডলিং ফায়ারলাইট

@ jpmc26 আমি আপনার নোটগুলি সহ আমার উত্তর আপডেট করেছি; আমি উল্লেখ করার কথা ভেবেছিলাম কিন্তু উত্তর জটিল করতে চাইনি।
এলিজাফক্স

16

এলিজাবেথ মায়ার্স সঠিক, প্রতিটি আর্কিটেকচারের জন্য প্রশ্নযুক্ত আর্কিটেকচারের জন্য একটি সংকলিত বাইনারি প্রয়োজন। আপনার সিস্টেমের চেয়ে পৃথক আর্কিটেকচারের জন্য বাইনারিগুলি তৈরি করতে আপনার প্রয়োজন একটি cross-compiler


বেশিরভাগ ক্ষেত্রে আপনাকে ক্রস সংকলক সংকলন করতে হবে। আমার কেবলমাত্র অভিজ্ঞতা আছে gcc(তবে আমি বিশ্বাস করি যে llvm, এবং অন্যান্য সংকলকগুলিরও একই পরামিতি রয়েছে)। একটি gccক্রস-সংকলকটি --targetকনফিগারটিতে যুক্ত করে অর্জন করা যায়:

./configure --build=i686-arch-linux-gnu --target=arm-none-linux-gnueabi

আপনি কম্পাইল করার প্রয়োজন gcc, glibcএবং binutilsএই পরামিতি সঙ্গে (এবং লক্ষ্য মেশিন এ কার্নেলের kernel হেডার প্রদান)।

অনুশীলনে এটি যথেষ্ট জটিল এবং বিভিন্ন বিল্ড ত্রুটি বিভিন্ন সিস্টেমে পপ আউট।

জিএনইউ সরঞ্জামচেইন কীভাবে সংকলন করা যায় সে সম্পর্কে বেশ কয়েকটি গাইড রয়েছে তবে আমি লিনাক্স থেকে স্ক্র্যাচটি সুপারিশ করব যা ধারাবাহিকভাবে বজায় থাকে এবং উপস্থাপিত কমান্ডগুলি কী করে তা ব্যাখ্যা করার জন্য খুব ভাল কাজ করে।

আরেকটি বিকল্প হ'ল ক্রস-সংকলকটির বুটস্ট্র্যাপ সংকলন। বিভিন্ন আর্কিটেকচারে বিভিন্ন আর্কিটেকচারে ক্রস সংকলক সংকলনের সংগ্রামের জন্য ধন্যবাদ crosstool-ngতৈরি হয়েছিল। এটি ক্রস সংকলক তৈরি করার জন্য প্রয়োজনীয় সরঞ্জামচেইনের উপর একটি বুটস্ট্র্যাপ দেয়।

crosstool-ngবিভিন্ন আর্কিটেকচারে বেশ কয়েকটি টার্গেট ট্রিপল্ট সমর্থন করে, মূলত এটি একটি বুটস্ট্র্যাপ যেখানে ক্রস-সংকলক সরঞ্জামচেনের সংকলনের সময় ঘটে যাওয়া সমস্যাগুলি সমাধানের জন্য লোকেরা তাদের সময় উত্সর্গ করে।


কয়েকটি ডিস্ট্রো প্যাকেজ হিসাবে ক্রস সংকলক সরবরাহ করে:

অন্য কথায়, ক্রস সংকলকগুলির ক্ষেত্রে আপনার ডিস্ট্রো কী উপলব্ধ আছে তা পরীক্ষা করুন। যদি আপনার ডিস্ট্রোতে আপনার প্রয়োজনের জন্য ক্রস সংকলক না থাকে আপনি সর্বদা এটি নিজেই সংকলন করতে পারেন।

তথ্যসূত্র:


কার্নেল মডিউল নোট

যদি আপনি নিজের ক্রস-সংকলকটি হাতে করে সংকলন করে থাকেন তবে কার্নেল মডিউলগুলি সংকলনের জন্য আপনার প্রয়োজনীয় সমস্ত কিছুই রয়েছে। এটি সঙ্কলনের জন্য আপনার কার্নেল শিরোনাম প্রয়োজন কারণ এটি glibc

তবে, আপনি যদি আপনার ডিস্ট্রো দ্বারা সরবরাহিত কোনও ক্রস-সংকলক ব্যবহার করছেন তবে আপনার লক্ষ্য কারখানাটিতে চালিত কার্নেলের কার্নেল শিরোনামগুলির প্রয়োজন হবে।


FWIW ফেডোরার পাশাপাশি ক্রস-সংকলক অন্তর্ভুক্ত রয়েছে।
ম্যাচটিএম

@ মেট্টিম - ধন্যবাদ, উত্তর টুইট করা হয়েছে, আমি বিশ্বাস করি ফেডোরা উইকির সঠিক অংশটি আমার সাথে যুক্ত হয়েছে।
গ্রোচামাল

2
অন্য আর্কিটেকচারের জন্য লিনাক্স এবং টুলচেন পাওয়ার জন্য লিনাক্স থেকে স্ক্র্যাচের চেয়ে সহজ উপায় crosstool-ng। আপনি এটি তালিকায় যুক্ত করতে চাইতে পারেন। এছাড়াও, কোনও প্রদত্ত আর্কিটেকচারের জন্য হাতে জিএনইউ ক্রস-টুলচেন কনফিগার এবং সংকলন অবিশ্বাস্যর সাথে জড়িত এবং কেবল --targetপতাকাগুলির চেয়ে অনেক বেশি ক্লান্তিকর । আমার সন্দেহ, এলএলভিএম কেন জনপ্রিয়তা পাচ্ছে তারই একটি অংশ; এটি এমনভাবে আর্কিটেক্টেড যাতে আপনার অন্য কোনও আর্কিটেকচারকে টার্গেট করার জন্য পুনর্নির্মাণের প্রয়োজন হয় না - পরিবর্তে আপনি একই ফ্রন্টএন্ড এবং অপ্টিমাইজার লাইব্রেরি ব্যবহার করে একাধিক ব্যাকেন্ডকে টার্গেট করতে পারেন।
Iwillnotexist আইডোনোটেক্সবাদ

@ আইলিনোটেক্সিস্ট আইডোনোটেক্সিস্ট - ধন্যবাদ, আমি উত্তরটি আরও উত্তর দিয়েছি। আমি এর আগে ক্রসস্টুল-এনজি এর আগে কখনও শুনিনি, এবং এটি দেখতে খুব দরকারী। আপনার মন্তব্যটি আসলে আমার পক্ষে বেশ কার্যকর হয়েছে।
গ্রোচামাল

9

লক্ষ্য করুন, একটি শেষ অবলম্বন (অর্থাত যখন আপনি সোর্স কোড না) হিসাবে তোমার মতোই emulators ব্যবহার করে একটি ভিন্ন আর্কিটেকচারের উপর বাইনেরিতে চালাতে পারেন যে qemu, dosboxবা exagear। কিছু এমুলেটর লিনাক্স ব্যতীত অন্য সিস্টেমগুলি অনুকরণ করার জন্য ডিজাইন করা হয়েছে (যেমন dosboxএমএস-ডস প্রোগ্রাম চালানোর জন্য ডিজাইন করা হয়েছে, এবং জনপ্রিয় গেমিং কনসোলগুলির জন্য প্রচুর পরিমাণে এমুলেটর রয়েছে)। এমুলেশনের একটি ওভারহেডের উল্লেখযোগ্য পারফরম্যান্স রয়েছে: এমুলেটেড প্রোগ্রামগুলি তাদের স্থানীয় অংশের তুলনায় 2-10 গুণ কম ধীর হয়।

যদি আপনাকে কোনও অ-নেটিভ সিপিইউতে কার্নেল মডিউলগুলি চালানোর প্রয়োজন হয়, আপনাকে একই আর্কিটেকচারের জন্য কার্নেল সহ পুরো ওএস অনুকরণ করতে হবে। এএআইএআইএফিকে লিনাক্স কার্নেলের অভ্যন্তরে বিদেশী কোড চালানো অসম্ভব।


3
অনুকরণের জন্য গতির জরিমানা প্রায়শই 10x এর চেয়েও বেশি হয়, তবে যদি 4GHz মেশিনে 16Mhz মেশিনের জন্য লিখিত কোড চালানোর চেষ্টা করা হয় (গতিতে 250: 1 পার্থক্য) যে এমুলেটরটিতে 50: 1 স্পিড পেনাল্টি রয়েছে এখনও হতে পারে কোডটি মূল প্ল্যাটফর্মে চালিত হওয়ার চেয়ে অনেক দ্রুত রান করুন।
সুপারক্যাট

7

X86 এবং ARM এর মধ্যে কেবল বাইনারিগুলি পোর্টেবল নয়, এআরএমের বিভিন্ন স্বাদ রয়েছে

অনুশীলনে আপনি যেটির মুখোমুখি হবেন সম্ভবত সে হ'ল এআরএমভি 6 বনাম এআরএমভি 7। রাস্পবেরি পাই 1 হ'ল এআরএমভি 6, পরবর্তী সংস্করণগুলি এআরএমভি 7। সুতরাং পাই 1-তে কাজ করে না এমন পরেগুলির কোডগুলি সংকলন করা সম্ভব।

ভাগ্যক্রমে ওপেন সোর্স এবং ফ্রি সফটওয়্যারগুলির একটি সুবিধা হ'ল যাতে আপনি এটি কোনও আর্কিটেকচারে পুনর্নির্মাণ করতে পারেন। যদিও এর জন্য কিছু কাজের প্রয়োজন হতে পারে।

(এআরএম ভার্সনটি বিভ্রান্তিকর, তবে এটির আগে ইনস্ট্রাকচার সেট আর্কিটেকচার (আইএসএ) নাম্বারটির আগে যে নম্বর রয়েছে তার কোনও ভি থাকলেও যদি তা না থাকে তবে এটি "কর্টেক্স এম0" বা "এআরএম 926 ইজেএস" এর মতো একটি মডেল নম্বর Model মডেল সংখ্যার কিছুই নেই have আইএসএ নম্বর দিয়ে করুন।)


2
... এবং তারপরে একই একই এআরএম স্বাদের জন্য এমনকি বিভিন্ন এবিআইও রয়েছে (ঠিক আমি পুরো আর্ম নরম / সফটফপি / হার্ড ভাসমান পয়েন্ট জগাখিচুড়ি সম্পর্কে ভাবছি)।
মাত্তেও ইতালি

1
নিবন্ধন করুন একাধিক এবিআই হ'ল স্নাফু, এমন কিছুর নিরাময় যা রোগের চেয়েও খারাপ। কিছু এআরএম-তে মোটামুটি ভিএফপি বা নিওন রেজিস্টার ছিল না, কারওটিতে 16, কিছু 32 ছিল te অনেক। এআরএম সঠিক কাজটি করতে সক্ষম হয়েছে - বৈশিষ্ট্যের একটি বড় সাধারণ উপসেটকে বাধ্যতামূলক করে।
আইভিলনোটেক্সিস্ট আইডোনোটেক্সবাদ

7

আপনার সর্বদা একটি প্ল্যাটফর্মকে লক্ষ্য করা প্রয়োজন । সহজতম ক্ষেত্রে, লক্ষ্য সিপিইউ সরাসরি বাইনারিতে সংকলিত কোডটি চালায় (এটি প্রায় এমএস ডসের সিওএম এক্সিকিউটেবলের সাথে সম্পর্কিত)। আসুন আমি সন্ধান করা দুটি ভিন্ন প্ল্যাটফর্ম বিবেচনা করি - আর্মিস্টিস এবং ইন্টেলিও। উভয় ক্ষেত্রেই, আমাদের কাছে একটি সহজ হ্যালো ওয়ার্ল্ড প্রোগ্রাম থাকবে যা স্ক্রিনে ৪২ আউটপুট দেয়। আমি এও ধরে নেব যে আপনি একটি প্ল্যাটফর্ম-অজগনীয় উপায়ে একটি বহু-প্ল্যাটফর্মের ভাষা ব্যবহার করছেন, সুতরাং উত্স কোড উভয়ের জন্য একই:

Print(42)

আর্মিস্টাইসে, আপনার কাছে একটি সাধারণ ডিভাইস ড্রাইভার রয়েছে যা মুদ্রণ সংখ্যার যত্ন নেয়, সুতরাং আপনাকে যা করতে হবে তা হ'ল একটি বন্দরের আউটপুট। আমাদের পোর্টেবল অ্যাসেম্বলি ভাষায়, এটি এই জাতীয় কিছুটির সাথে মিল রাখবে:

out 1234h, 42

তবে, বা ইন্টেলিও সিস্টেমে এমন কোনও জিনিস নেই, সুতরাং এটি অন্যান্য স্তরগুলির মধ্য দিয়ে যেতে হবে:

mov a, 10h
mov c, 42
int 13h

উফফ, আমরা এমনকি মেশিন কোডে পৌঁছানোর আগেই দু'জনের মধ্যে ইতিমধ্যে একটি তাত্পর্যপূর্ণ পার্থক্য রয়েছে! এটি লিনাক্স এবং এমএস ডস, বা একটি আইবিএম পিসি এবং একটি এক্স-বক্সের মধ্যে যে পার্থক্য রয়েছে তার সাথে মোটামুটি মিল রয়েছে (যদিও উভয়ই একই সিপিইউ ব্যবহার করতে পারে)।

তবে ওএসের জন্য এটিই। ধরে নেওয়া যাক আমাদের একটি এইচএল রয়েছে যা নিশ্চিত করে যে সমস্ত বিভিন্ন হার্ডওয়্যার কনফিগারেশন অ্যাপ্লিকেশন স্তরের ক্ষেত্রে একইভাবে পরিচালিত হয়েছে - মূলত, আমরা এমনকি আর্মিস্টাইসে ইন্টেলিও পদ্ধতির ব্যবহার করব এবং আমাদের "বহনযোগ্য সমাবেশ" কোডটি একইভাবে শেষ হবে। এটি আধুনিক ইউনিক্স-মতো সিস্টেম এবং উইন্ডোজ উভয়ই ব্যবহৃত হয়, প্রায়শই এমবেড করা পরিস্থিতিতেও। ভাল - এখন আমরা আর্মিস্টিস এবং ইন্টেলিও উভয়ে একই সত্যই পোর্টেবল এসেম্বলি কোড পেতে পারি। তবে বাইনারিদের কী হবে?

যেমনটি আমরা ধরে নিয়েছি, সিপিইউকে সরাসরি বাইনারি চালানো দরকার। আসুন আমাদের কোডের প্রথম লাইনটি দেখুন mov a, 10h, ইন্টেলিও তে:

20 10

উহু. দেখা যাচ্ছে যে mov a, constantএটি এত জনপ্রিয় যে এটির নিজস্ব নির্দেশ রয়েছে, তার নিজস্ব অপকোড রয়েছে। আর্মিস্টাইস কীভাবে এটি পরিচালনা করে?

36 01 00 10

হুম। এর জন্য অপকোড রয়েছে mov.reg.imm, তাই আমাদের নিবন্ধিত করা নিবন্ধটি নির্বাচন করতে আমাদের আরও একটি যুক্তি প্রয়োজন। এবং ধ্রুবকটি সর্বদা একটি 2-বাইট শব্দ, বড়-এন্ডিয়ান স্বরলিপিতে - আর্মিস্টাইসকে ঠিক এভাবেই নকশা করা হয়েছিল, বাস্তবে, আর্মিস্টাইসের সমস্ত নির্দেশাবলী 4 বাইট দীর্ঘ, কোনও ব্যতিক্রম নয়।

এখন আর্মিস্টিসে ইন্টেলিও থেকে বাইনারি চালানোর কল্পনা করুন: সিপিইউ নির্দেশকে ডিকোডিং শুরু করে, অপকোড খুঁজে পেয়েছে 20h। আর্মিস্টাইসে, এটি and.imm.regনির্দেশের সাথে মিলে যায় say এটি 2-বাইট শব্দের ধ্রুবক পড়ার চেষ্টা করে (যা পড়ে 10XX, ইতিমধ্যে একটি সমস্যা) এবং তারপরে নিবন্ধের নম্বর (অন্য XX)। আমরা ভুল যুক্তি দিয়ে ভুল নির্দেশনাটি কার্যকর করছি। এবং আরও খারাপ, পরবর্তী নির্দেশনাটি সম্পূর্ণ বোগাস হবে, কারণ আমরা প্রকৃতপক্ষে অন্য নির্দেশ খেয়েছি, ভেবে এটি ডেটা ছিল।

অ্যাপ্লিকেশনটিতে কাজ করার কোনও সুযোগ নেই এবং এটি সম্ভবত ক্রাশ হয়ে যায় বা প্রায় অবিলম্বে স্তব্ধ হয়ে যায়।

এখন, এর অর্থ এই নয় যে কোনও এক্সিকিউটিভের পক্ষে সর্বদা এটি বলা দরকার যে এটি ইন্টেলিও বা আর্মিস্টাইসে চলে। আপনাকে কেবল এমন প্ল্যাটফর্মের সংজ্ঞা দিতে bashহবে যা সিপিইউ থেকে আলাদা নয় ( ইউনিক্সের মতো ), বা সিপিইউ এবং ওএস উভয় (জাভা বা। নেট, এবং আজকাল এমনকি জাভাস্ক্রিপ্ট, ধরণের)। এই ক্ষেত্রে, অ্যাপ্লিকেশনটি সমস্ত পৃথক সিপিইউ এবং ওএসের জন্য একটি এক্সিকিউটেবল ব্যবহার করতে পারে, যখন লক্ষ্য সিস্টেমে কিছু অ্যাপ্লিকেশন বা পরিষেবা থাকে (যা সঠিক সিপিইউ এবং / অথবা ওএসকে সরাসরি লক্ষ্য করে) যা প্ল্যাটফর্ম-স্বতন্ত্র কোডকে কিছুতে অনুবাদ করে সিপিইউ আসলে কার্যকর করতে পারে। এটি পারফরম্যান্স, ব্যয় বা সক্ষমতা হিট নিয়ে আসতে পারে না।

সিপিইউগুলি সাধারণত পরিবারগুলিতে আসে। উদাহরণস্বরূপ, x86 পরিবারের সমস্ত সিপিইউতে ঠিক একই পদ্ধতিতে এনকোড করা নির্দেশাবলীর একটি সাধারণ সেট রয়েছে, সুতরাং প্রতিটি x86 সিপিইউ যতক্ষণ না কোনও এক্সটেনশন ব্যবহার করার চেষ্টা না করে ততক্ষণ প্রতিটি x86 প্রোগ্রাম চালাতে পারে (উদাহরণস্বরূপ, ভাসমান পয়েন্ট অপারেশন বা ভেক্টর অপারেশন)। X86-এ, বর্তমানে সর্বাধিক সাধারণ উদাহরণগুলি অবশ্যই ইনটেল এবং এএমডি। এমটেমড ডিভাইসগুলির জন্য বেশ জনপ্রিয় এটম পরিবার এআরএম পরিবারে সিপিইউগুলি ডিজাইন করার একটি সুপরিচিত সংস্থা। উদাহরণস্বরূপ অ্যাপলের নিজস্ব এআরএম সিপিইউ রয়েছে।

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


3

এই প্রশ্নটি এমন একটি পরিবেশে পুনরায় কাস্ট করা সম্ভব যা আরও পরিচিত হতে পারে। তুলনা দ্বারা:

"আমার একটি রুবি প্রোগ্রাম রয়েছে যা আমি চালাতে চাই, তবে আমার প্ল্যাটফর্মে কেবল একটি পাইথন ইন্টারপ্রেটার রয়েছে I আমি কি আমার রুবি প্রোগ্রাম চালানোর জন্য পাইথন ইন্টারপ্রেটার ব্যবহার করতে পারি, বা পাইথনে আমার প্রোগ্রামটি আবার লিখতে হবে?"

একটি নির্দেশিকা সেট আর্কিটেকচার ("টার্গেট") একটি ভাষা - একটি "মেশিন ল্যাঙ্গুয়েজ" - এবং বিভিন্ন সিপিইউ বিভিন্ন ভাষা প্রয়োগ করে। সুতরাং একটি এআরএম সিপিইউকে একটি ইন্টেল বাইনারি চালানো জিজ্ঞাসা করা পাইথন ইন্টারপ্রেটার ব্যবহার করে রুবি প্রোগ্রাম চালানোর চেষ্টা করার মতো।


2

জিসিসি নির্দিষ্ট 'সিপিইউ'র' 'নির্দেশ সেট' 'বোঝাতে' 'আর্কিটেকচার' 'পদ ব্যবহার করে, এবং "টার্গেট" সিবিইউ এবং আর্কিটেকচারের সংমিশ্রণকে এবিআই, লাইবসি, এন্ডিয়ান-নেস এবং আরও কিছু ভেরিয়েবলের সাথে কভার করে (সম্ভবত "খালি ধাতু" সহ) একটি সাধারণ সংকলক লক্ষ্য সংমিশ্রণের একটি সীমিত সেট (সম্ভবত একটি এবিআই, একটি সিপিইউ পরিবার, তবে সম্ভবত উভয় 32- এবং 64-বিট)। একটি ক্রস-কম্পাইলার সাধারণত এর অর্থ হয় সিস্টেম ছাড়া অন্য কোনো লক্ষ্য সঙ্গে একটি কম্পাইলার একাধিক লক্ষ্যমাত্রা বা Abis সঙ্গে এক (এছাড়াও দেখুন উপর সঞ্চালিত হয়, অথবা এই )।

বাইনারিগুলি কি বিভিন্ন সিপিইউ আর্কিটেকচার জুড়ে বহনযোগ্য?

সাধারণভাবে, না। প্রচলিত শর্তাবলী একটি বাইনারি একটি নির্দিষ্ট সিপিইউ বা সিপিইউ পরিবারের জন্য নেটিভ অবজেক্ট কোড । তবে, বেশ কয়েকটি কেস রয়েছে যেখানে সেগুলি মাঝারি থেকে উচ্চ পোর্টেবল হতে পারে:

  • একটি আর্কিটেকচার হ'ল অন্যটির সুপারসেট (সাধারণত x86 বাইনারি i386 বা i686 টার্গেট করে সর্বশেষতম এবং সবচেয়ে বড় x86, উদাহরণস্বরূপ -march=core2)
  • একটি আর্কিটেকচার দেশীয় অনুকরণ বা অন্যটির অনুবাদ সরবরাহ করে (আপনি ক্রুসোর কথা শুনে থাকতে পারেন ), বা সামঞ্জস্যপূর্ণ সহ প্রসেসর সরবরাহ করে (যেমন পিএস 2 )
  • ওএস এবং রানটাইম সমর্থন মাল্টারার্ক (উদাহরণস্বরূপ x86_64 এ 32-বিট x86 বাইনারি চালানোর ক্ষমতা), বা ভিএম / জেআইটি বিজোড় করে তোলে (অ্যান্ড্রয়েড ডালভিক বা এআরটি ব্যবহার করে )
  • "ফ্যাট" বাইনারিগুলির জন্য সমর্থন রয়েছে যা প্রতিটি সমর্থিত আর্কিটেকচারের জন্য মূলত নকল কোড ধারণ করে

আপনি যদি কোনওভাবে এই সমস্যাটি সমাধান করতে পরিচালনা করেন তবে অগণিত গ্রন্থাগারের সংস্করণগুলির অন্যান্য পোর্টেবল বাইনারি সমস্যা (আমি আপনাকে দেখছি এমন glibc) তারপরে উপস্থিত হবে। (বেশিরভাগ এম্বেড থাকা সিস্টেমগুলি আপনাকে অন্তত সেই নির্দিষ্ট সমস্যা থেকে বাঁচায়।)

যদি আপনি ইতিমধ্যে না থাকেন তবে এখন দৌড়াতে gcc -dumpspecsএবং gcc --target-helpআপনার বিরুদ্ধে কী রয়েছে তা দেখার জন্য এখনই ভাল সময় ।

ফ্যাট বাইনারিগুলির বিভিন্ন ত্রুটি রয়েছে , তবে এখনও সম্ভাব্য ব্যবহার রয়েছে ( ইএফআই )।

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

যে কোনও সমসাময়িক লিনাক্স সিস্টেম ইএলএফ বাইনারিগুলি ব্যবহার করবে ( এই পিডিএফের প্রযুক্তিগত বিবরণ ), গতিশীল ইএলএফ বাইনারিগুলির ক্ষেত্রে কার্নেলটি চিত্রটিকে মেমরিতে লোড করার দায়িত্বে থাকে তবে এটি ইএলএফ-তে সেট '' দোভাষী '' এর কাজ is ভারী উত্তোলন করতে শিরোনাম। সাধারণত এটি নির্ভর করে যে সমস্ত নির্ভরশীল ডায়নামিক লাইব্রেরি উপলব্ধ রয়েছে (এটি '' ডায়নামিক '' বিভাগের সাহায্যে যা লাইব্রেরি এবং কিছু অন্যান্য কাঠামোগুলি তালিকাবদ্ধ করে যা প্রয়োজনীয় প্রতীকগুলি তালিকাভুক্ত করে) - তবে এটি প্রায় একটি সাধারণ উদ্দেশ্য ইন্ডিরিশন স্তর।

$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses \
shared libs), stripped
$ readelf -p .interp /bin/ls
    String dump of section '.interp':
      [     0]  /lib/ld-linux.so.2

( /lib/ld-linux.so.2এটি একটি ইএলএফ বাইনারিও রয়েছে, এর কোনও দোভাষী নেই, এবং এটি নেটিভ বাইনারি কোড)

ইএলএফের সমস্যাটি হ'ল বাইনারি ( readelf -h /bin/ls) -এর শিরোনামটি এটি একটি নির্দিষ্ট আর্কিটেকচার, শ্রেণি (32- বা 64-বিট), এন্ডিয়ান-নেস এবং এবিআই (অ্যাপলের "সর্বজনীন" ফ্যাট বাইনারিগুলির জন্য বিকল্প বাইনারি ফর্ম্যাট মাচ-ও ব্যবহার করে পরিবর্তে যা এই সমস্যার সমাধান করে, এটি নেক্সটস্টেপ থেকে উত্পন্ন হয়েছে)। এর অর্থ হ'ল একটি ELF এক্সিকিউটেবল অবশ্যই চালু হওয়া সিস্টেমের সাথে অবশ্যই মেলে। এক পালাবার ডিম পাড়া ব্যাখ্যাকারী, এই কোন এক্সিকিউটেবল (এক সহ নির্যাস বা মানচিত্র মূলত বাইনারি এবং তাদের পূজা স্থাপত্য নির্দিষ্ট সাবসেকশনগুলির) হতে পারে, কিন্তু আপনি এখনও ELF ধরণ (গুলি) আপনার সিস্টেম রান অনুমতি দেবে দ্বারা সীমাবদ্ধ করা হয় । (ফ্রিবিএসডি- র লিনাক্স ইএলএফ ফাইলগুলি পরিচালনা করার একটি আকর্ষণীয় উপায় রয়েছে , brandelfএটি ইএলএফ এবিআই ক্ষেত্রটি সংশোধন করে))

লিনাক্সে মাচ-ও-র জন্য (ব্যবহার করে binfmt_misc) সমর্থন রয়েছে, সেখানে একটি উদাহরণ রয়েছে যা আপনাকে দেখায় যে কীভাবে একটি ফ্যাট (32- & 64-বিট) বাইনারি তৈরি করতে এবং চালাতে হয়। রিসোর্স কাঁটাচামচ / এডিএস , যেমনটি ম্যাকের ভিত্তিতে করা হয়েছিল, এটি কার্যকরী হতে পারে, তবে কোনও স্থানীয় লিনাক্স ফাইল সিস্টেম এটি সমর্থন করে না।

কমবেশি একই জিনিস কার্নেল মডিউলগুলির ক্ষেত্রে প্রযোজ্য, .koফাইলগুলিও ইএলএফ হয় (যদিও তাদের কোনও ইন্টারপ্রিটার সেট নেই)। এক্ষেত্রে একটি অতিরিক্ত স্তর রয়েছে যা uname -rঅনুসন্ধানের পথে কার্নেল সংস্করণ ( ) ব্যবহার করে , এমন কিছু যা তাত্ত্বিকভাবে সংস্করণের সাথে ইএলএফ-এর পরিবর্তে করা যেতে পারে তবে কিছুটা জটিলতা এবং সামান্য লাভের বিষয়ে আমার সন্দেহ।

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

  1. যদি আমার কাছে 'x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz' চালানোর জন্য একটি অ্যাপ্লিকেশন সংকলিত থাকে, তবে আমি কি অন্য সিস্টেমে 'এআরএম টার্গেট, লিনাক্স ওএস সংস্করণ xyz' তে একই সংকলিত বাইনারি চালাতে পারি?

ইএলএফ দিয়ে নয়, এটি আপনাকে এটি করতে দেয় না।

  1. যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে পুনরায় বিল্ডিং / পুনরায় সংকলনের জন্য অ্যাপ্লিকেশন উত্স কোড পাওয়া 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি'?

সহজ উত্তর হ্যাঁ। (জটিল জবাবগুলির মধ্যে অনুকরণ, অন্তর্বর্তী উপস্থাপনা, অনুবাদক এবং জেআইটি অন্তর্ভুক্ত; কেবলমাত্র i386 অপকডগুলি ব্যবহার করার জন্য একটি আই 686 বাইনারি কেবলমাত্র এখানে আকর্ষণীয় নয়, এবং এবিআই ফিক্সআপগুলি সম্ভবত স্থানীয় কোড অনুবাদ করার মতো কঠোর are )

  1. একইভাবে, আমার যদি একটি লোডযোগ্যযোগ্য কার্নেল মডিউল (ডিভাইস ড্রাইভার) থাকে যা 'x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz' তে কাজ করে, আমি কি অন্য সিস্টেমে 'এআরএম লক্ষ্য, লিনাক্স ওএস সংস্করণ xyz' তে একই সংকলিত .ko লোড / ব্যবহার করতে পারি? ?

না, ইএলএফ আপনাকে এটি করতে দেবে না।

  1. যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় হ'ল প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি' ব্যবহার করে পুনর্নির্মাণ / পুনরায় কম্পাইল করার জন্য ড্রাইভার উত্স কোডটি পাওয়া?

সহজ উত্তর হ্যাঁ। আমি বিশ্বাস করি ফ্যাটএলএফ আপনাকে .koএমন একটি নির্মাণ করতে দেয় যা মাল্টি-আর্কিটেকচার, তবে কোনও সময়ে প্রতিটি সমর্থিত আর্কিটেকচারের জন্য একটি বাইনারি সংস্করণ তৈরি করতে হয়। যেগুলির জন্য কার্নেল মডিউলগুলির প্রয়োজন হয় সেগুলি প্রায়শই উত্স সহ আসে এবং প্রয়োজনীয় হিসাবে তৈরি হয়, যেমন ভার্চুয়ালবক্স এটি করে।

এটি ইতিমধ্যে একটি দীর্ঘ ঘূর্ণিঝড় উত্তর, এখানে আরও একটি পথ রয়েছে। কার্নেলটিতে ইতিমধ্যে একটি ভার্চুয়াল মেশিন নির্মিত হয়েছে, যদিও একটি উত্সর্গীকৃত: বিপিএফ ভিএম যা প্যাকেটগুলির সাথে মেলে ব্যবহৃত হয়। হিউম্যান রিডেবল ফিল্টার "হোস্ট ফু এবং পোর্ট 22 নয়") একটি বাইটোকোডে সংকলিত হয়েছে এবং কার্নেল প্যাকেট ফিল্টার এটি কার্যকর করে । নতুন ইবিপিএফ কেবল প্যাকেটের জন্য নয়, তাত্ত্বিকভাবে ভিএম কোড যে কোনও সমসাময়িক লিনাক্স জুড়ে বহনযোগ্য, এবং এলএলভিএম এটি সমর্থন করে তবে সুরক্ষার কারণে এটি সম্ভবত প্রশাসনিক বিধি ছাড়া অন্য কোনও কিছুর জন্য উপযুক্ত হতে পারে না going


এখন, বাইনারি এক্সিকিউটেবলের সংজ্ঞা দিয়ে আপনি কতটা উদার, তার উপর নির্ভর করে আপনি binfmt_miscশেল স্ক্রিপ্টের সাথে ফ্যাট বাইনারি সাপোর্ট, এবং জিপ ফাইলগুলি একটি ধারক বিন্যাস হিসাবে প্রয়োগ করতে পারেন (আব)

#!/bin/bash

name=$1
prog=${1/*\//}      # basename
prog=${prog/.woz/}  # remove extension
root=/mnt/tmpfs
root=$(TMPDIR= mktemp -d -p ${root} woz.XXXXXX)
shift               # drop argv[0], keep other args

arch=$(uname -m)                  # i686
uname_s=$(uname -s)               # Linux
glibc=$(getconf GNU_LIBC_VERSION) # glibc 2.17
glibc=${glibc// /-}               # s/ /-/g

# test that "foo.woz" can unzip, and test "foo" is executable
unzip -tqq "$1" && {
  unzip -q -o -j -d ${root} "$1"  "${arch}/${uname_s}/${glibc}/*" 
  test -x ${root}/$prog && ( 
    export LD_LIBRARY_PATH="${root}:${LD_LIBRARY_PATH}"
    #readlink -f "${root}/${prog}"   # for the curious
    exec -a "${name}" "${root}/${prog}" "$@" 
  )
  rc=$?
  #rm -rf -- "${root}/${prog}"       # for the brave
  exit $rc
}

এটিকে "ওয়াজবিন" বলুন এবং এ জাতীয় কিছু দিয়ে সেট আপ করুন:

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
printf ":%s:%s:%s:%s:%s:%s:%s" \
  "woz" "E" "" "woz" "" "/path/to/wozbin" ""  > /proc/sys/fs/binfmt_misc/register

এটি .wozকার্নেলের সাথে ফাইলগুলি নিবন্ধভুক্ত করে, wozbinস্ক্রিপ্টটি পরিবর্তিত হয়ে প্রথম .wozফাইলটিকে একটি অনুরোধ করা ফাইলের পথে সেট করা হয় ।

পোর্টেবল (ফ্যাট) .woz ফাইল পেতে, কেবল test.wozএকটি ডিরেক্টরি শ্রেণিবদ্ধের সাথে একটি জিপ ফাইল তৈরি করুন যাতে:

i686/ 
    \- Linux/
            \- glibc-2.12/
armv6l/
    \- Linux/
            \- glibc-2.17/

প্রতিটি খিলান / ওএস / লিবিসি ডিরেক্টরিতে (একটি স্বেচ্ছাসেবী পছন্দ) আর্কিটেকচার-নির্দিষ্ট testবাইনারি এবং .soফাইলগুলির মতো উপাদান রাখুন । আপনি যখন এটি প্রার্থনা করেন তখন প্রয়োজনীয় সাব-ডাইরেক্টরিটি একটি tmpfs ইন-মেমরি ফাইল সিস্টেমে প্রবেশ করা হয় ( /mnt/tmpfsএখানে) এবং অনুরোধ করা হয়।


0

বেরি বুট, আপনার কয়েকটি সমস্যার সমাধান করুন .. তবে এটি কীভাবে আর্ম এইচএফ, নরমল / রেগুলআর লিনাক্স ডিস্ট্রোতে x86-32 / 64 বিটের জন্য চালানো যায় তা পুনরায় শুরু হয় না।

আমি মনে করি এটি আইসোলিনাক্সে (ইউএসবি-তে বোটলোডার লিনাক্স) তৈরি করা উচিত যা কিছু নিয়মিত রূপান্তরকারী যা নিয়মিত ডিস্ট্রো এবং রাইড / লাইভ কনফারেন্সে এইচএফ এ রূপান্তর করতে পারে।

কেন? কারণ যদি প্রতিটি লিনাক্স বেরি বুট দ্বারা আর্ম-এইচএফ-এ কাজ করে রূপান্তরিত করা যায় তবে এটি বেরি বুট প্রক্রিয়াটি আইসোলিনাক্সে তৈরি করতে সক্ষম হবে যা আমরা এক্সপেল ইচারের জন্য ব্যবহার করব বা উবুন্টু ক্রিয়েট স্টার্টআপ ডিস্কে তৈরি করব।

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