د VPN نصبولوونکی 32-bit وايي: پرځای یې د ELF سرلیک وګورئ
د کلمې اندازه د لارښوونې ټولګه نه پېژني. د کلاس، ماشین او ژباړونکي لوستلو او بیا د کوربه سره سم build غوښتلو طریقه.
یو د ډاونلوډ پاڼه 32-bit وايي، فایل پر Raspberry Pi راځي، او نصبولوونکی داسې پیغام سره ناکامېږي چې د ستونزې هېڅ ګټور برخه نه نوموي۔ دوه بشپړ بېلې اجرایوي فایلې دواړه د ELF په معنا 32-bit ګڼل کېږي، او له هغو یوازې یوه کولای شي پر هغه بورډ وګرځي۔ د کلاس ساحه یوه حقیقت دی، د ماشین ساحه بل، او د فایل نوم تاسو ته دواړه په باوري ډول نه وايي۔ د کتابخانې بدلولو یا بل هېندارې هڅولو دمخه سرلیک ولولئ۔
کلاس د کلمې اندازه وايي، ماشین د لارښوونې ټولګه
د Linux ELF مرجع په فایل سرلیک کې د کلاس ساحه او د ماشین ساحه تعریفوي، او دواړه بېلو پوښتنو ته ځواب وايي۔ کلاس وايي چې فایل 32-bit که 64-bit بڼه کاروي؛ ماشین وايي چې دا د کومې لارښوونې ټولګې لپاره جوړ شوی۔ 32-bit x86 build او 32-bit ARM build په لومړي کې سره یوځای او په دویم کې بېل دي۔ همدا ډول یو لیبل چې د سمې کلمې اندازې ژمنه کوي بیا هم داسې کوډ ورکوي چې پروسیسر یې نه شي کولی ډیکوډ کړي۔ د لوستلو وړ درېیم ارزښت غوښتل شوی ژباړونکی دی، چې نوم یې پروګرام سرلیکونه هغه وخت اخلي چې باینري یو اعلان کړي۔
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
لومړی کمانډ سرلیک چاپوي، دویم یې د فایل لپاره که وي پروګرام سرلیکونه چاپوي، او درېیم یې هغه شریک شوي شیان لیست کوي چې لوډر ته به ورته اړتیا وي۔ کلاس، ماشین او ژباړونکی یوځای ولیکئ، ځکه چې دا درې ارزښتونه په دې پوړ کې ټوله د مطابقت پوښتنه ده۔ له دغو درېیو څخه هیڅ یو د ډاونلوډ تڼۍ کې نه ښکاري، له همدې کبله فایل باید وکتل شي نه تشریح۔
کوم ژباړونکی له کرنل غواړي
هغه اجرایوي فایل چې ژباړونکی اعلانوي له کرنل یو ځانګړی لوډر لاره غواړي۔ کله چې هغه لوډر نه وي، پیل ناکامېږي که څه هم هغه فایل چې تاسو نومولی دقیقاً همالته پروت دی۔ دا هغه ټکی دی چې خلک پرېکړه کوي ډاونلوډ خراب دی، حال دا چې ریښتینی ځواب هغه لوډر دی چې وېش یې نه برابروي۔
لوډر له هغې سیستم سره سم کړئ چې تاسو یې واقعاً چلوئ: د OS خپرونه، د کاروونکي فضا معماری، او هغه بنډل چې لوډر برابروي۔ 64-bit کرنل یوازې هغه وخت 32-bit کاروونکې فضا چلولی شي چې هغه فضا او د هغې لوډر نصب وي، نو د پروسیسر وړتیاوې فیصله کوونکی فاکتور نه دی۔ یو لنډ چک ژباړونکی په یوه کرښه کې نوموي، او دا له ملاتړ ټکټ څخه لږ وخت اخلي۔ Shell سکریپټ بیا بل ډول ناکامېږي، ځکه د هغې ژباړونکی په لومړۍ کرښه کې نومول شوی نه په ELF سرلیک کې، او هغه کرښه لوستل هېڅ لګښت نه لري۔
file --brief ./vendor-vpn
ډاونلوډ له بنډل معمارۍ سره سم کړئ
د وېشونو بنډل معمارۍ هماغه توپیر په خپله اصطلاحاتو کې کوډ کوي، او د پلورونکي ملاتړ بیان هماغه اصطلاحاتو ته اشاره کوي۔ هغه ارزښت چې ستاسو بنډل مدیر یې راپور ورکوي له هغه ارزښت سره پرتله کړئ چې پلورونکی یې مستند کوي، د بازارموندنې لیبل د فایل نوم سره پرتله کولو پرځای۔ هغه جوړې چې ستونزه جوړوي amd64 د arm64 پر وړاندې، او armhf د armel پر وړاندې دي، ځکه هره جوړه په ډاونلوډ لیست کې د بدلېدونکې په څېر ښکاري۔ د x64 یا ia32 سره پای ته رسېدونکی فایل نوم د build هدف بیانوي، نه هغه ماشین چې دا ساتي۔
| Label on the download | ELF class | e_machine | Interpreter the kernel wants | How it fails on the wrong host |
|---|---|---|---|---|
| amd64 | ELF64 | x86-64 | /lib64/ld-linux-x86-64.so.2 | Immediate exec failure on an ARM board |
| armhf | ELF32 | ARM | /lib/ld-linux-armhf.so.3 | Loads on a soft-float system, then fails on a float ABI call |
| i386 | ELF32 | Intel 80386 | /lib/ld-linux.so.2 | Exec format error where no 32-bit loader package exists |
هره کرښه هغه پېښه ده چې کلمې اندازه سمه ښکاري او کوډ بیا هم غلط رفتار کوي، یا چې پیلېږي او بیا یوه طبقه ښکته ناکامېږي۔ د ژباړونکي کالم د اشارې نه بلکې د سختې اړتیا په توګه ولولئ، ځکه کرنل هغه لاره ستاسو د کوډ له چلېدو دمخه حل کوي۔ ایمیولیشن یو ځای پرځای کولو پرېکړه ده چې خپلې کارکردګۍ او ملاتړ پایلې لري، او پراخه کلمې اندازه اعلان کوونکی پروسیسر هېڅکله دا نه اشاره کوي۔
dpkg --print-architecture
ENOEXEC او ENOENT بېلې ناکامۍ دي
د پیل پړاو د دوو تېروتنو له یوې راپور ورکوي، او هغوی بېلو ستونزو ته اشاره کوي۔ د تېروتنې ارزښت لوستل بل څه چلولو دمخه ناکامي طبقه بندي کوي۔
ENOEXEC معنا دا ده چې بڼه ونه پېژندل شوه: غلط معماری، غلط کلاس یا داسې څه چې هېڅ اجرایوي فایل نه دی۔ په ELF فایل ENOENT معمولاً معنا دا ده چې ژباړونکی نشته، که څه هم هغه فایل چې تاسو غوښتی شته۔ هماغه ENOENT کولای شي دا هم ووايي چې د سکریپټ ژباړونکی نشته، له همدې کبله د سکریپټ لومړۍ کرښه مهمه ده۔ په هر حال پیغام طبقه نوموي، او هر «ونه موندل شو» د ورکې تنظیماتو په توګه ګڼل څېړنه غلط لوري ته استوي۔ په ټکټ کې د تېروتنې ارزښت نقل کړئ، ځکه دا د شاوخوا جملې په پرتله بیا ویلو ته ښه مقاومت کوي۔
کله چې باینري پیل نه شي څه مه کوئ
ناتشریح شوې باینري د shell پوښ له لارې زورولو دا نه چلوي۔ پر هغه فایل چې باور نه لرئ د تړاو پلټونکی په بې پروایۍ مه چلوئ، ځکه چلول یې په ځینو حالاتو کې د باینري څخه کوډ اجرا کولی شي۔ د لوډر سمبولیک لینکونه مه زیاتوئ، کوربه کتابخانې مه بدلوئ او د پیغام تېرولو لپاره د درېیم لوري هېندارې څخه زوړ ارشیف مه راوړئ۔ له دغو هر یو د بدلون سطحه پراخوي پرته له دې چې هغه ناسمونې ته لاس ووهي چې سرلیک دمخه نومولې وه۔
کله چې پلورونکي ته ورځئ، کیسه نه بلکې ارزښتونه واستوئ: د OS خپرونه، د بنډل معماری، د کلاس او ماشین تارونه، غوښتل شوی ژباړونکی او لومړۍ د تېروتنې کرښه۔ هغه ټولګه ملاتړ پوښتنې له ناکام نصبولوونکي سکرین شاټ څخه ژر حل کوي۔ زاړه اثار او یاد شوي فورم پایلې اوسنی ملاتړ میټریکس نه دي، او کله چې بومي باینري بار شي، پروفایل، تصدیق او لارښوونه بېل کار پاتې کېږي۔