জিসিসি নির্দিষ্ট 'সিপিইউ'র' 'নির্দেশ সেট' 'বোঝাতে' 'আর্কিটেকচার' 'পদ ব্যবহার করে, এবং "টার্গেট" সিবিইউ এবং আর্কিটেকচারের সংমিশ্রণকে এবিআই, লাইবসি, এন্ডিয়ান-নেস এবং আরও কিছু ভেরিয়েবলের সাথে কভার করে (সম্ভবত "খালি ধাতু" সহ) একটি সাধারণ সংকলক লক্ষ্য সংমিশ্রণের একটি সীমিত সেট (সম্ভবত একটি এবিআই, একটি সিপিইউ পরিবার, তবে সম্ভবত উভয় 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
পদ্ধতির ব্যবহার করে না , এটি ইএলএফ শিরোলেখ সম্পর্কিত সমস্যাগুলি সাইড-পদক্ষেপ এবং ফ্যাট কার্নেল মডিউলগুলিকেও মঞ্জুরি দেয়।
- যদি আমার কাছে 'x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz' চালানোর জন্য একটি অ্যাপ্লিকেশন সংকলিত থাকে, তবে আমি কি অন্য সিস্টেমে 'এআরএম টার্গেট, লিনাক্স ওএস সংস্করণ xyz' তে একই সংকলিত বাইনারি চালাতে পারি?
ইএলএফ দিয়ে নয়, এটি আপনাকে এটি করতে দেয় না।
- যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে পুনরায় বিল্ডিং / পুনরায় সংকলনের জন্য অ্যাপ্লিকেশন উত্স কোড পাওয়া 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি'?
সহজ উত্তর হ্যাঁ। (জটিল জবাবগুলির মধ্যে অনুকরণ, অন্তর্বর্তী উপস্থাপনা, অনুবাদক এবং জেআইটি অন্তর্ভুক্ত; কেবলমাত্র i386 অপকডগুলি ব্যবহার করার জন্য একটি আই 686 বাইনারি কেবলমাত্র এখানে আকর্ষণীয় নয়, এবং এবিআই ফিক্সআপগুলি সম্ভবত স্থানীয় কোড অনুবাদ করার মতো কঠোর are )
- একইভাবে, আমার যদি একটি লোডযোগ্যযোগ্য কার্নেল মডিউল (ডিভাইস ড্রাইভার) থাকে যা 'x86 টার্গেট, লিনাক্স ওএস সংস্করণ xyz' তে কাজ করে, আমি কি অন্য সিস্টেমে 'এআরএম লক্ষ্য, লিনাক্স ওএস সংস্করণ xyz' তে একই সংকলিত .ko লোড / ব্যবহার করতে পারি? ?
না, ইএলএফ আপনাকে এটি করতে দেবে না।
- যদি উপরেরটি সত্য না হয় তবে একমাত্র উপায় হ'ল প্রাসঙ্গিক সরঞ্জামচয়ন ব্যবহার করে 'উদাহরণস্বরূপ, আর্ম-লিনাক্স-জ্ঞুয়াবি' ব্যবহার করে পুনর্নির্মাণ / পুনরায় কম্পাইল করার জন্য ড্রাইভার উত্স কোডটি পাওয়া?
সহজ উত্তর হ্যাঁ। আমি বিশ্বাস করি ফ্যাটএলএফ আপনাকে .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
এখানে) এবং অনুরোধ করা হয়।