Dirbant su ARM vykdomaisiais failais ir bibliotekomis, anksčiau ar vėliau kyla klausimas: Ar jis kompiliuojamas naudojant kietąjį slankųjį kodą (ARMHF), ar su švelnųjį slankųjį kodą (ARMEL)? Skirtumas yra reikšmingas, nes jis turi įtakos dvejetainių skaičių suderinamumui ir našumui atliekant slankiojo kablelio operacijas. Laimei, pats ELF dvejetainis kodas turi reikiamų užuominų, leidžiančių patikimai tai nustatyti.
Šiame straipsnyje apžvelgsime, kaip patikrinti ARM ELF naudojant šią programą readelf Norėdami atskirti šiuos du variantus, aptarsime, kokių etikečių ieškoti, kokius išvesties skirtumus galite rasti priklausomai nuo įrankio versijos ir kaip interpretuoti tokias detales kaip „Thumb“ ar „NEON“. Taip pat aptarsime, kodėl ARMEL ir ARMHF pasirinkimas priimamas kompiliavimo metu. ne vykdymo sistemojeir išsklaidome dažniausiai kylančias abejones dėl daugiaarchinių aplinkų, kuriose egzistuoja ir „arm-linux-gnueabihf“, ir „arm-linux-gnueabi“.
Ką reiškia ARMHF (kietai slankiojančios) ir ARMEL (lengvai slankiojančios)?
Šį elgesį apibrėžia AAPCS (ARM architektūros procedūrų iškvietimo standartas), kuris aprašo, kaip perduodami parametrai ir grąžinamos reikšmės. AAPCS turi variantųIr tas, kuris mus domina atskirti ARMHF, yra tas, kuris susijęs su VFP, rodikliu, kurį matysime atsispindintį dvejetainio atributuose.
ELF ir jo antraštė: kodėl ji suteikia mums visą informaciją
ELF (vykdomasis ir susiejamas formatas) yra faktinis „Linux“ standartas, kuriame duomenys saugomi antraštės ir atributų skyriuose. informacija apie tikslinę architektūrą ir ABI konvencijas, naudojamas vykdomajam failui arba bibliotekai kompiliuoti. Jei jus domina išsami informacija, tiesiog ieškokite ELF antraštės specifikacijoje, kad pamatytumėte visus esamus laukus.
Norint apžiūrėti ELF, įrankis readelf Tai tiesioginis kelias. A variantas panaikina praktiškai viską, o A variantas leidžia sutelkti dėmesį į nuo architektūros priklausančią informaciją (mūsų atveju ARM), rodant tokius atributus kaip slankiojo kablelio tipas, ar įjungtas „Thumb“, NEON palaikymas ir kitos svarbios žymės.
Paruoškite aplinką naudodami ARMEL ir ARMHF
Jei norite palyginti realaus pasaulio išvestį, praktiškas būdas yra įdiegti abiejų variantų gcc/g++ įrankių grandines Ubuntu kompiuteryje. Taip padarydami, Gausite sistemos bibliotekas „armel“ ir „armhf“ programoms. įdiegta greta dėka „multiarch“.
Įdiegus, tipiniai bibliotekos maršrutai yra šie: /usr/arm-linux-gnueabihf/lib, skirtas ARMHF y /usr/arm-linux-gnueabi/lib, skirtas ARMELTurėdami abu, galite palyginti, pavyzdžiui, matematinę biblioteką libm.so.6 ir stebėti, kaip atributai keičiasi priklausomai nuo varianto.
Galutinė užuomina: Tag_ABI_VFP_args su readelf
Praktinis testas apima ELF analizę naudojant „readelf“ ir nuorodų į FP paiešką atributuose. Labai paprasta taktika yra filtruoti išvestį pagal eilutę FP, siekiant sutelkti dėmesį į slankiojo kablelio skaičius. nes labiausiai atskleidžiantis indikatorius yra atributas „Tag_ABI_VFP_args“.
„libm.so.6“ bibliotekoje, sukompiliuotoje kaip ARMEL („soft-float“), matysite tipinius ARM atributus, bet Eilutė Tag_ABI_VFP_args nebus rodomaPriešingai, ARMHF (kietai slankiojančiame) libm.so.6 faile bus rodoma papildoma eilutė su šiuo atributu, patvirtinanti VFP iškvietimo konvencijos naudojimą.
readelf -A /usr/arm-linux-gnueabi/lib/libm.so.6 | grep FP
ARMEL sistemoje filtravimas pagal FP rodys informaciją, susijusią su bendromis slankiojo kablelio operacijomis, bet be atributo, kuris deklaruoja VFP argumentusKartojant tai per ARMHF:
readelf -A /usr/arm-linux-gnueabihf/lib/libm.so.6 | grep FP
Rasite papildomą įrašą, kurio tipas Tag_ABI_VFP_args o tai yra neabejotinas kieto plūduriavimo požymis. Ši detalė praktiškai yra tai, kas Tai leidžia mums patikimai teigti, kad dvejetainis kodas atitinka ABI kietąjį slankųjį kodą.
Išvesties skirtumai priklausomai nuo „Readelf“ versijos
Priklausomai nuo „readelf“ įgyvendinimo ir versijos, tiksli teksto forma gali skirtis. Pavyzdžiui, su „readelf“, sukompiliuotu iš elftoolchain-0.6.1Papildoma eilutė ne tik nurodo atributą, bet ir gali būti aprašyta taip: Tag_ABI_VFP_args: AAPCS (VFP variantas).
Toje pačioje išvesčių grupėje yra dar dvi vertės, kurios gali būti rodomos kaip „Tag_ABI_VFP_args“: „AAPCS (bazinis variantas)“ ir „įrankių grandinei būdingi“Prieinamoje literatūroje minimos šios alternatyvos, nors ne visada aišku, kokiomis konkrečiomis sąlygomis kiekviena iš jų grąžinama. Svarbu pripažinti, kad VFP varianto paminėjimas Tai siejama su kietojo plūduriavimo atveju.
Be profesinio mokymo: -A taip pat dėsto architektūrą, nykštį ir NEON
Nors čia daugiausia dėmesio skiriame ARMHF ir ARMEL skirtumams, verta prisiminti, kad readelf -A Jis siūlo platesnį dvejetainio failo vaizdą. Be slankiojo kablelio atributų, jo išvestis parodys tikslią tikslinę architektūrą, jei dvejetainis failas Jis sukurtas naudojant nykštį ir jei palaikymas buvo įjungtas NEON, be kitų svarbių optimizavimo ir suderinamumo galimybių.
Visa tai padeda patvirtinti, kad dvejetainis kodas ne tik atitinka jūsų laukiamą FP variantą, bet ir Jis suderintas su instrukcijų rinkiniu ir plėtiniais kurį turite įrenginyje, kuriame jis veiks.
Rekomenduojamos darbo eigos pavyzdys
Tipinė abiejų libm.so.6 variantų palyginimo seka gali būti tokia paprasta: Išvardykite maršrutus, paleiskite „readelf“ ir filtruokite pagal FPTai trumpai parodys pagrindinį skirtumą tarp „armel“ ir „armhf“.
# ARMEL (soft-float)
ls -l /usr/arm-linux-gnueabi/lib/libm.so.6
readelf -A /usr/arm-linux-gnueabi/lib/libm.so.6 | grep FP
# ARMHF (hard-float)
ls -l /usr/arm-linux-gnueabihf/lib/libm.so.6
readelf -A /usr/arm-linux-gnueabihf/lib/libm.so.6 | grep FP
Jei ARMHF režime stebite liniją su Tag_ABI_VFP_args Kadangi ARMEL faile jo nėra, skirtumą galite laikyti patvirtintu. O jei norite matyti viską, visada galite naudoti readelf -a norint gauti visą antraščių, skyrių, atributų ir simbolių išklotinę.
Kompiliacija, o ne sistema: kas nusprendžia ARMEL ar ARMHF
Svarbu pabrėžti vieną koncepciją: ARMEL/ARMHF variantas nustatomas pagal dvejetainį kodą.ELF failo struktūrą lemia kompiliavimo procesas, o ne abstrakti „sistema“. Jei vykdomąjį failą kompiliuosite su fiksuoto slankumo palaikymu, gausite ARMHF ELF; kitu atveju tai bus ARMEL. Šis skirtumas kyla iš kompiliavimo proceso ir yra užkoduotas ELF atributuose.
Dėl šios priežasties, jei jus neramina tai, kurį kelią pasirinkti savo projekte, paprastai tai padaryti yra paprasčiau. išspręsti kompiliavimo metu su kompiliatoriaus ir susiejimo parinktimis bei su išankstinio apdorojimo sąlygotu kodu. Nėra įprasta norėti perjungti ARMEL ir ARMHF tame pačiame dvejetainiame faile vykdymo metu. nes tai apima skirtingus ABI.
„Makefile“ generuojamos antraštės: praktinis metodas
Jei norite, kad pats vykdomasis failas deklaruotų savo „tapatybę“ kūrimo metu, labai naudinga technika yra sugeneruoti antraštė iš Makefile Kompiliavimo etape kompiliavimo sistema aptinka, ar kompiliuojate „armel“, ar „armhf“ kalba, ir į antraštės failą įkelia konstantą, kuri vėliau įtraukiama į šaltinio kodą.
Taikant šį metodą, galutinis dvejetainis failas gali atskleisti, pavyzdžiui, komandą -versija kuris atspausdina, ar jis buvo sukurtas kaip ARMEL, ar kaip ARMHF, nereikalaujant nieko „aptikti“ vykdymo metu. Apskritai ši praktika geriau atitinka tai, kad ABI nustatomas kompiliavimo metu ir jis neturėtų dinamiškai kisti.
Kodėl norėtumėte tai žinoti vykdymo metu?
Tie, kurie užduoda šį klausimą, kartais bando pritaikyti savo elgesį įkarštyje. Tačiau realybė tokia, kad Įprasta praktika yra atskirti kodą naudojant išankstinio apdorojimo direktyvas ir sukompiliuoti skirtingus variantus, vieną „armel“, o kitą – „armhf“. Abiejų sumaišymas tame pačiame artefakte nėra realus, nes kiekvienas iš jų priklauso nuo savo bibliotekų rinkinio ir kitokia ABI.
Todėl bendra rekomendacija yra priimti sprendimą prieš kompiliavimąir vykdymo metu tiesiog patikrinkite, ar tikslinėje aplinkoje yra tinkamos bibliotekos dvejetainiam failui, kurį ruošiatės paleisti. Norėdami patikrinti jau sukurtą dvejetainį failą, readelf Tai išlieka tiesiogine priemone.
Multiarch: Kodėl turite ir arm-linux-gnueabihf, ir arm-linux-gnueabi
Jei, rodydami katalogų sąrašą savo sistemoje, matote, kad turite arm-linux-gnueabihf ir arm-linux-gnueabi sugyvenimas nebūtinai yra klaida: tai yra daugiaarchėTai leidžia lygiagrečiai įdiegti ir naudoti kelias architektūras arba ABI variantus, palengvinant kryžminį kompiliavimą ir testavimą.
Pavyzdžiui, Debian'o aplinkose buvo atvejų, kai buvo nuspręsta Pašalinkite daugialypę architektūrą numatytuosiuose „Wheezy“ atvaizduose nes parama buvo „žalioji“ ir kėlė daugiau problemų nei naudos. Vėliau „Jessie“ ir vėlesnės versijos pagerino palaikymą daugiaarchinė sistema, todėl armel/armhf sambūvis yra perspektyvesnis ir nesukelia tiek daug galvos skausmų.
Teisingai interpretuoti maršrutus nepakanka
Matant biblioteką /usr/arm-linux-gnueabihf/lib, galima teigti, kad tai ARMHF, ir tas pats pasakytina apie /usr/arm-linux-gnueabi/lib, skirtą ARMEL. Bet jei norite būti tikri, Atidarykite ELF ir peržiūrėkite jo atributusKeliai yra naudingi kaip vadovas, nors sudėtingose sistemose su keliais archyvais arba rankinėmis atsarginėmis kopijomis, gali suklaidinti.
Vėlgi, išėjimas readelf -A Tai pateikia neginčijamą įrodymą: „Tag_ABI_VFP_args“ buvimas „hard-float“ atveju ir jo nebuvimas „soft-float“ atveju. Be to, kitos vėliavėlės tai patvirtins. instrukcijos ir plėtiniai kad dvejetainis failas gali reikalauti.
Ko dar galite pasimokyti iš -A, be FP
ARM atributų skiltyje, kurioje rodomas -A, ne tik nurodoma, ar yra VFP. Ji taip pat nurodoma, ar dvejetainis failas Jis pažymėtas kaip nykštys, architektūros variantas (pvz., ARMv7) ir ar yra palaikymas NEONŠi informacija padeda patikrinti, ar dvejetainis failas suderinamas su tiksline įranga, ir išvengti netikėtumų diegimo metu.
Pavyzdžiui, apsvarstykite vykdymo aplinkos patvirtinimą: kartu su ARMEL ir ARMHF patikrinimu, Patikrinkite nykštį ir NEONĄ Tai gali įspėti apie subtilius nesuderinamumus, kurie iš pirmo žvilgsnio nėra matomi.
Dažnai užduodami klausimai ir trumpi patarimai
- Ar galiu tai aptikti be „readelf“? Techniškai tai galima nustatyti iš kelio arba kaip buvo sukurtas jūsų projektas, tačiau patikimas metodas yra patikrinti ELF failą. `readelf -A` pateikia įrodymus pačiame dvejetainiame faile.
- Ar pakanka pamatyti „VFP“ prie išėjimo? Bendrų nuorodų į VFP matymas rodo galimybes, tačiau lemiama linija yra Tag_ABI_VFP_args ARMHF. Jo nebuvimas ARMEL yra lygiai taip pat reikšmingas.
- Ką daryti, jei mano skaitytuvas rodo „AAPCS (VFP variantas)“? Tai alternatyvi tos pačios idėjos forma, matoma tam tikruose kūriniuose, pavyzdžiui, paremtuose elftoolchain-0.6.1Taip pat gali būti rodoma „AAPCS (bazinis variantas)“ arba „specifinė įrankių grandinei“.
- Kodėl turiu įdiegtos abi versijos? Pagal daugiaarchėKai kuriose aplinkose tai normalu. Tiesiog įsitikinkite, kad susiejate ir paleidžiate su bibliotekų rinkiniu, kuris atitinka jūsų naudojamą dvejetainį failą.
Trumpai apie šaltinius ir jų finansavimą
Kai kuriuose techniniuose leidiniuose, kuriuose nagrinėjamos šios temos, yra pranešimų, skirtų paremti jų darbą per kriptovaliutų aukas, tokias platformas kaip „Patreon“ arba partnerių nuorodas į parduotuves, tokias kaip „Amazon“ ar „AliExpress“. Tai įprasta praktika nepriklausomoje žiniasklaidoje, kuri kartais Jie naudoja filialų nuorodas savo straipsniuose, kad uždirbtų komisinį mokestį, jei pirksite spustelėję.
Dvejetainių failų audito mentalinis kontrolinis sąrašas
Prieš priimdami biblioteką ar vykdomąjį failą savo įrenginiui, peržiūrėkite šiuos punktus: readelf užklausa -A, ieško buvimo ar nebuvimo Tag_ABI_VFP_argsPažvelkite į tikslinę architektūrą ir patikrinkite, ar „Thumb“ ir „NEON“ atitinka aparatinę įrangą, kurioje ketinate ją naudoti.
Jei dirbate su keliomis įrankių grandinėmis, įdiegtomis per „multiarch“, Atkreipkite ypatingą dėmesį į maršrutus Kompiliatoriaus ir susiejimo programos aplinkos kintamieji turi būti sukonfigūruoti taip, kad būtų išvengta ARMEL antraščių ir bibliotekų maišymo su ARMHF dvejetainiais failais arba atvirkščiai. Maža klaida gali sukelti problemų. painūs simptomai susiejimo arba vykdymo metu.
Tipinės klaidos, kurių reikia vengti
Klasikinė klaida – pernelyg pasitikėti savimi ir manyti, kad biblioteka yra fiksuotai laisvai pasiekiama, nes ji yra aplanke „arm-linux-gnueabihf“. nepatvirtinus ELF atributųKita dažna klaida – bandymas susieti ARMHF vykdomąjį failą su ARMEL bibliotekomis (arba atvirkščiai), dėl ko paprastai atsiranda simbolių klaidų arba keistas veikimas.
Taip pat dažnai norima „aptikti vykdymo metu“, kad būtų galima pakeisti bibliotekos kelius. Atminkite, kad ARMEL/ARMHF pasirinkimas nėra improvizuotas vykdymo metu.Tai užkoduota dvejetainiame faile. Pakoreguokite diegimus ir paketus taip, kad kiekvienas vykdomasis failas gautų savo varianto bibliotekas.
Jei reikia greitos nuorodos, pagalvokite apie šiuos veiksmus: suraskite biblioteką arba vykdomąjį failą (pavyzdžiui, libm.so.6), paleisti readelf -A Jei norite iš karto pereiti prie esmės, failą filtruokite pagal FP ir patikrinkite, ar yra eilutė. Tag_ABI_VFP_args (kietasis slankusis kodas) arba, jei trūksta (švelnusis slankusis kodas). Tada patikrinkite architektūrą, „Thumb“ ir NEON, kad užbaigtumėte dvejetainį profilį.
Lyginant ARMEL ir ARMHF toje pačioje sistemoje, prisiminkite daugiaarchinį kontekstą Ir tai, kad pagrindinis skirtumas slypi AAPCS apibrėžtame slankiojo kablelio ABI. Šiuo požiūriu „readelf“ atributų interpretavimas tampa greitu ir tiksliu uždaviniu.
Akivaizdu, kad su tinkamu įrankiu ir žinant, kur ieškoti, Nustatyti, ar ARM ELF yra ARMHF, ar ARMEL, yra sekundžių reikalas.Svarbiausia yra nustatyti „Tag_ABI_VFP_args“ atributą, skirtą „hard-float“ vertei, ir panaudoti „readelf -A“, kad gautumėte papildomo konteksto apie architektūrą, „Thumb“ ir NEON. Atsižvelgiant į „multiarch“ ypatumus ir tai, kad ABI pasirinkimas yra fiksuotas kompiliavimo metu, Išvengsite painiavos ir sutaupysite laiko tikrinant dvejetainius failus ir bibliotekas savo projektuose.