Старонка спампоўкі кажа пра 32-біт, файл трапляе на Raspberry Pi, і інсталятар падае з паведамленнем, якое не называе ніводнай карыснай часткі праблемы. Два цалкам розныя выканальныя файлы абодва лічацца 32-бітнымі ў сэнсе ELF, і толькі адзін з іх можа працаваць на гэтай плаце. Поле класа — гэта адзін факт, поле машыны — іншы, а імя файла надзейна не паведамляе ні пра адно з іх. Прачытайце загаловак, перш чым мяняць бібліятэку або спрабаваць іншае люстэрка.

Клас кажа пра памер слова, машына — пра набор інструкцый

Даведнік па ELF у Linux вызначае поле класа і поле машыны ў загалоўку файла, і гэтыя два адказваюць на розныя пытанні. Клас кажа, ці выкарыстоўвае файл 32-бітную або 64-бітную форму; машына кажа, для якога набору інструкцый ён сабраны. 32-бітная зборка x86 і 32-бітная зборка ARM згодныя ў першым і рашуча розныя ў другім. Вось як этыкетка, якая абяцае правільны памер слова, усё роўна пастаўляе код, які працэсар не можа дэкадаваць. Трэцяе значэнне, вартае чытання, — гэта запытаны інтэрпрэтатар, які загалоўкі праграмы называюць, калі бінарнік аб’яўляе яго.

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

Першая каманда друкуе загаловак, другая друкуе загалоўкі праграмы, калі яны ў файле ёсць, а трэцяя пералічвае агульныя аб’екты, якія спатрэбяцца загрузчыку. Запісвайце клас, машыну і інтэрпрэтатар разам, бо гэтыя тры значэнні — усё пытанне сумяшчальнасці на гэтым узроўні. Ніводнае з трох не з’яўляецца на кнопцы спампоўкі, таму файл трэба даследаваць, а не апісваць.

Які інтэрпрэтатар ён просіць у ядра

Выканальны файл, які аб’яўляе інтэрпрэтатар, просіць у ядра адзін пэўны шлях загрузчыка. Калі гэтага загрузчыка няма, запуск падае, нават калі названы вамі файл ляжыць прама там. Менавіта ў гэты момант людзі вырашаюць, што спампоўка пашкоджаная, хаця сапраўдны адказ — загрузчык, якога дыстрыбутыў не пастаўляе.

Узгадніце загрузчык з сістэмай, у якой вы сапраўды працуеце: выпуск АС, архітэктура прасторы карыстальніка і пакет, які пастаўляе загрузчык. 64-бітнае ядро можа запускаць 32-бітную прастору карыстальніка, толькі калі гэтая прастора і яе загрузчык усталяваныя, таму здольнасці працэсара не з’яўляюцца вырашальным фактарам. Адна кароткая праверка называе інтэрпрэтатар у адным радку, і гэта займае менш часу, чым зварот у падтрымку. Скрыпт абалонкі падае яшчэ інакш, бо яго інтэрпрэтатар названы ў першым радку, а не ў загалоўку ELF, і прачытаць гэты радок нічога не каштуе.

file --brief ./vendor-vpn

Узгадніце спампоўку з архітэктурай пакета

Архітэктуры пакетаў дыстрыбутываў кадуюць тое ж адрозненне ў сваёй лексіцы, і менавіта на гэтую лексіку спасылаецца заява пастаўшчыка пра падтрымку. Параўнайце значэнне, якое паведамляе ваш мэнэджар пакетаў, са значэннем, якое дакументуе пастаўшчык, замест таго каб параўноўваць маркетынгавы этыкет з імем файла. Пары, што ствараюць праблемы, — гэта amd64 супраць arm64 і armhf супраць armel, бо кожная з іх выглядае ўзаемазаменнай у спісе спампоўкі. Імя файла, якое сканчаецца на x64 або ia32, апісвае мэту зборкі, а не машыну, якая яго трымае.

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

Кожны радок — гэта выпадак, калі памер слова выглядае правільным, а код усё роўна паводзіць сябе няправільна, або калі ён стартуе і потым падае ўзроўнем ніжэй. Чытайце слупок інтэрпрэтатара як жорсткую патрабаванне, а не як падказку, бо ядро вырашае гэты шлях перш, чым выконваецца любы ваш код. Эмуляцыя — гэта рашэнне пра разгортванне з уласнымі наступствамі для прадукцыйнасці і падтрымкі, і працэсар, які рэкламуе шырэйшы памер слова, ніколі не мае яе на ўвазе.

dpkg --print-architecture

ENOEXEC і ENOENT — розныя збоі

Стадыя запуску паведамляе пра адну з дзвюх памылак, і яны паказваюць на розныя праблемы. Чытанне значэння памылкі класіфікуе збой, перш чым вы запусціце што-небудзь яшчэ.

ENOEXEC азначае, што фармат не распазнаны: няправільная архітэктура, няправільны клас або нешта, што зусім не выканальны файл. ENOENT для файла ELF звычайна азначае, што інтэрпрэтатар адсутнічае, нават калі запытаны вамі файл існуе. Той жа ENOENT можа таксама азначаць адсутнасць інтэрпрэтатара скрыпта, таму першы радок скрыпта мае значэнне. У любым выпадку паведамленне называе ўзровень, а стаўленне да кожнага «не знойдзена» як да адсутнай канфігурацыі накіроўвае расследаванне ў няправільны бок. Цытуйце значэнне памылкі ў заяўцы, бо яно лепш за суседні сказ перажывае пераказ.

Чаго не рабіць, калі бінарнік не запускаецца

Прымусовае праходжанне невытлумачанага бінарніка праз абгортку абалонкі не прымушае яго працаваць. Не запускайце праверку залежнасцей неабдумана на файле, якому не давяраеце, бо яе запуск у некаторых абставінах можа выканаць код з бінарніка. Не дадавайце сімвалічныя спасылкі загрузчыка, не замяняйце хатнія бібліятэкі і не цягніце стары архіў з люстэрка трэцяга боку, каб абысці паведамленне. Кожнае з гэтага пашырае плошчу змен, не закранаючы неадпаведнасць, якую загаловак ужо назваў.

Звяртаючыся да пастаўшчыка, дасылайце значэнні, а не гісторыю: выпуск АС, архітэктуру пакета, радкі класа і машыны, запытаны інтэрпрэтатар і першы радок памылкі. Гэты набор вырашае пытанні падтрымкі хутчэй за здымак экрана інсталятара, які падае. Старыя артэфакты і прыгаданыя вывады форуму — не актуальная матрыца падтрымкі, а пасля загрузкі натыўнага бінарніка профіль, аўтэнтыфікацыя і маршрутызацыя застаюцца асобнай працай.

Падобныя артыкулы