Ukurasa wa upakuaji unasema 32-bit, faili inatua kwenye Raspberry Pi, na kisakinishi kinashindikana kwa ujumbe usiotaja sehemu yoyote muhimu ya tatizo. Faili mbili tofauti kabisa zinazoweza kutekelezwa zote zinahesabiwa kama 32-bit kwa maana ya ELF, na ni moja tu kati yao inayoweza kufanya kazi kwenye ubao huo. Sehemu ya darasa ni ukweli mmoja, sehemu ya mashine ni mwingine, na jina la faili haliwezi kukueleza lolote kati ya hayo mawili kwa uhakika. Soma kichwa kabla ya kubadilisha maktaba au kujaribu kioo kingine.

Darasa husema ukubwa wa neno, mashine husema seti ya maagizo

Marejeo ya ELF ya Linux hufafanua sehemu ya darasa na sehemu ya mashine katika kichwa cha faili, na zote mbili hujibu maswali tofauti. Darasa husema kama faili inatumia umbo la 32-bit au la 64-bit; mashine husema seti ya maagizo iliyoundwa kwa ajili yake. Build ya x86 ya 32-bit na build ya ARM ya 32-bit zinakubaliana kwenye la kwanza na kutofautiana kwenye la pili. Hivyo lebo inayoahidi ukubwa sahihi wa neno bado hutoa msimbo ambao kichakataji hakiwezi kuufafanua. Thamani ya tatu inayofaa kusomwa ni mkalimani anayeombwa, ambaye vichwa vya programu humtaja wakati binary inatangaza mmoja.

readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED

Amri ya kwanza huchapisha kichwa, ya pili huchapisha vichwa vya programu ikiwa faili ina, na ya tatu huorodhesha vitu vinavyoshirikiwa ambavyo kipakiaji atahitaji. Andika darasa, mashine na mkalimani pamoja, kwa sababu thamani hizi tatu ni swali lote la uoanifu katika tabaka hili. Hakuna hata moja kati ya tatu inayoonekana kwenye kitufe cha upakuaji, kwa hiyo faili inapaswa kuchunguzwa badala ya kuelezwa.

Ni mkalimani gani inaomba kutoka kwa kernel

Faili inayotekelezeka inayotangaza mkalimani inaomba kernel njia moja mahususi ya kipakiaji. Kipakiaji hicho kinapokosekana, uzinduzi unashindikana hata kama faili uliyoitaja iko mahali hapo. Hapa ndipo watu huamua kuwa upakuaji umeharibika, wakati jibu halisi ni kipakiaji ambacho usambazaji hautoi.

Linganisha kipakiaji na mfumo unaoendesha kwa kweli: toleo la OS, usanifu wa nafasi ya mtumiaji na kifurushi kinachotoa kipakiaji. Kernel ya 64-bit inaweza kuendesha nafasi ya mtumiaji ya 32-bit tu wakati nafasi hiyo na kipakiaji chake vimesakinishwa, kwa hiyo uwezo wa kichakataji si sababu ya kuamua. Ukaguzi mmoja mfupi hutaja mkalimani katika mstari mmoja, na huchukua muda mdogo kuliko tiketi ya msaada. Skripti ya shell inashindikana kwa namna nyingine tena, kwa sababu mkalimani wake ametajwa kwenye mstari wa kwanza na si katika kichwa cha ELF, na kusoma mstari huo hakugharimu chochote.

file --brief ./vendor-vpn

Linganisha upakuaji na usanifu wa kifurushi

Usanifu wa vifurushi vya usambazaji huweka alama ya tofauti hiyo hiyo katika msamiati wao wenyewe, na msamiati huo ndio unaorejelewa na taarifa ya msaada ya muuzaji. Linganisha thamani inayoripotiwa na msimamizi wako wa vifurushi na thamani inayoandikwa na muuzaji, badala ya kulinganisha lebo ya masoko na jina la faili. Jozi zinazosababisha matatizo ni amd64 dhidi ya arm64, na armhf dhidi ya armel, kwa sababu kila jozi inaonekana kubadilishana katika orodha ya upakuaji. Jina la faili linaloishia na x64 au ia32 hufafanua lengo la build, si mashine inayoihifadhi.

Label on the downloadELF classe_machineInterpreter the kernel wantsHow it fails on the wrong host
amd64ELF64x86-64/lib64/ld-linux-x86-64.so.2Immediate exec failure on an ARM board
armhfELF32ARM/lib/ld-linux-armhf.so.3Loads on a soft-float system, then fails on a float ABI call
i386ELF32Intel 80386/lib/ld-linux.so.2Exec format error where no 32-bit loader package exists

Kila mstari ni kisa ambapo ukubwa wa neno unaonekana sahihi na msimbo bado unafanya vibaya, au ambapo unaanza kisha unashindikana tabaka moja chini. Soma safu ya mkalimani kama sharti gumu na si kama dokezo, kwa sababu kernel hutatua njia hiyo kabla ya sehemu yoyote ya msimbo wako kuendeshwa. Uigaji ni uamuzi wa usambazaji wenye athari zake za utendaji na msaada, na hautokei kamwe kwa kichakataji kinachotangaza ukubwa mpana wa neno.

dpkg --print-architecture

ENOEXEC na ENOENT ni kushindikana tofauti

Hatua ya uzinduzi huripoti kosa moja kati ya mawili, na yanaelekeza kwenye matatizo tofauti. Kusoma thamani ya kosa huainisha kushindikana kabla ya kuendesha kitu kingine chochote.

ENOEXEC inamaanisha umbo halikutambuliwa: usanifu mbaya, darasa baya au kitu ambacho si faili inayotekelezeka hata kidogo. ENOENT kwenye faili ya ELF kwa kawaida inamaanisha mkalimani hayupo, ingawa faili uliyoomba ipo. ENOENT hiyo hiyo inaweza pia kumaanisha mkalimani wa skripti hayupo, kwa hiyo mstari wa kwanza wa skripti ni muhimu. Kwa vyovyote ujumbe hutaja tabaka, na kuchukua kila «haikupatikana» kama usanidi unaokosekana huelekeza uchunguzi upande usiofaa. Nukuu thamani ya kosa kwenye tiketi, kwa sababu inastahimili kusimuliwa upya vizuri kuliko sentensi inayoizunguka.

Mambo ya kutofanya wakati binary haianzi

Kulazimisha binary isiyoelezwa kupita kwenye kifuniko cha shell hakuifanyi ifanye kazi. Usiendeshe kikagua vitegemezi kizembe kwenye faili usiyoiamini, kwa sababu kuendesha kwake kunaweza katika hali fulani kutekeleza msimbo kutoka kwenye binary. Usiongeze viungo vya ishara vya kipakiaji, usibadilishe maktaba za mwenyeji na usichukue kumbukumbu ya zamani kutoka kioo cha mtu wa tatu ili kupita ujumbe. Kila kimoja cha hivi kinapanua uso wa mabadiliko bila kugusa kutokubaliana ambako kichwa kimeshakitaja.

Unapowasiliana na muuzaji, tuma thamani na si hadithi: toleo la OS, usanifu wa kifurushi, mifuatano ya darasa na mashine, mkalimani aliyoombelewa na mstari wa kwanza wa kosa. Seti hiyo hutatua maswali ya msaada kwa haraka kuliko picha ya skrini ya kisakinishi kinachoshindikana. Vitu vya zamani na matokeo ya jukwaa yaliyokumbukwa si matrix ya msaada ya sasa, na binary asilia ikiisha kupakiwa, wasifu, uthibitishaji na uelekezaji hubaki kazi tofauti.

Makala zinazohusiana