Při práci se spustitelnými soubory a knihovnami pro ARM dříve či později vyvstane otázka: Je to kompilováno s hard-float (ARMHF) nebo soft-float (ARMEL)? Rozdíl je významný, protože ovlivňuje binární kompatibilitu a výkon operací s plovoucí desetinnou čárkou. Naštěstí samotný binární soubor ELF obsahuje potřebné vodítka k jeho spolehlivému určení.
V tomto článku se podíváme na to, jak zkontrolovat ARM ELF pomocí utility readelf Abychom tyto dvě varianty rozlišili, probereme, jaké popisky hledat, jaké rozdíly ve výstupu můžete najít v závislosti na verzi nástroje a jak interpretovat detaily, jako je Thumb nebo NEON. Také si probereme, proč se během kompilace rozhoduje mezi ARMEL a ARMHF. ne v běhovém systémua objasňujeme běžné pochybnosti o multiarch prostředích, kde koexistují arm-linux-gnueabihf a arm-linux-gnueabi.
Co znamenají ARMHF (hard-float) a ARMEL (soft-float)?
Toto chování je definováno standardem AAPCS (ARM Architecture Procedure Call Standard), který popisuje, jak se předávají parametry a vracejí hodnoty. AAPCS má variantyA ten, který nás zajímá pro rozlišení ARMHF, je ten spojený s VFP, což je indikátor, který se odráží v atributech binárního souboru.
ELF a jeho záhlaví: proč nám poskytuje všechny informace
ELF (Executable and Linkable Format) je de facto standardem v Linuxu a ukládá data do záhlaví a atributů. informace o cílové architektuře a konvence ABI používané ke kompilaci spustitelného souboru nebo knihovny. Pokud máte zájem o vyčerpávající podrobnosti, jednoduše vyhledejte specifikaci záhlaví ELF a zobrazte všechna existující pole.
Pro kontrolu ELF je potřeba nástroj readelf Je to přímá cesta. Možnost -a převrátí prakticky všechno a možnost -A umožňuje zaměření na informace závislé na architektuře (v našem případě ARM) zobrazující atributy, jako je typ s plovoucí desetinnou čárkou, zda je povolen Thumb, podpora NEON a další relevantní příznaky.
Připravte prostředí s ARMEL a ARMHF
Pokud chcete porovnat výstupy z reálného světa, praktickým způsobem je nainstalovat sady nástrojů gcc/g++ pro obě varianty na počítač s Ubuntu. Tímto způsobem... Získáte systémové knihovny pro armel a armhf instalovány vedle sebe díky víceobloukovému systému.
Po instalaci jsou typické trasy knihovny: /usr/arm-linux-gnueabihf/lib pro ARMHF y /usr/arm-linux-gnueabi/lib pro ARMELDíky oběma můžete porovnat například matematickou knihovnu libm.so.6 a pozorovat, jak se atributy mění v závislosti na variantě.
Definitivní vodítko: Tag_ABI_VFP_args s readelf
Praktický test zahrnuje analýzu ELF pomocí programu readelf a hledání odkazů na FP v atributech. Velmi přímočarou taktikou je filtrovat výstup podle řetězce FP a zaměřit se na čísla s plovoucí desetinnou čárkou. protože nejvýznamnějším indikátorem je atribut Tag_ABI_VFP_args.
V knihovně libm.so.6 zkompilované jako ARMEL (soft-float) uvidíte typické atributy ARM, ale Řádek Tag_ABI_VFP_args se nezobrazí.Naproti tomu v souboru ARMHF (hard-float) libm.so.6 se zobrazí další řádek s tímto atributem, který potvrzuje použití konvence volání VFP.
readelf -A /usr/arm-linux-gnueabi/lib/libm.so.6 | grep FP
V ARMELu filtrování podle FP zobrazí informace týkající se obecných možností operací s plovoucí desetinnou čárkou, ale bez atributu, který deklaruje argumenty VFPPři opakování přes ARMHF:
readelf -A /usr/arm-linux-gnueabihf/lib/libm.so.6 | grep FP
Najdete zde další položku typu Argumenty_tagu_ABI_VFP což je nezaměnitelným znakem tvrdého splávku. Právě tento detail je v praxi To nám umožňuje spolehlivě konstatovat, že binární soubor sleduje ABI hard-float..
Variace výstupu v závislosti na verzi readelf
V závislosti na implementaci a verzi programu readelf se může přesný tvar textu lišit. Například u programu readelf kompilovaného z elftoolchain-0.6.1Doplňující řádek nejen označuje atribut, ale lze jej popsat jako: Tag_ABI_VFP_args: AAPCS (varianta VFP).
Ve stejné skupině výstupů se pro Tag_ABI_VFP_args mohou objevit dvě další hodnoty: „AAPCS (základní varianta)“ a „specifické pro danou platformu“Dostupná literatura tyto alternativy zmiňuje, ačkoli není vždy jasné, za jakých přesných podmínek je každá z nich vrácena. Důležité je si uvědomit, že zmínka o variantě VFP Je to spojeno s pouzdrem s tvrdým plovákem.
Kromě odborného vzdělávání: -A také vyučuje architekturu, Thumb a NEON
Ačkoli se zde zaměřujeme na rozlišení mezi ARMHF a ARMEL, je třeba si uvědomit, že readelf -A Nabízí širší pohled na binární soubor. Jeho výstup zobrazí kromě atributů s plovoucí desetinnou čárkou i přesnou cílovou architekturu, pokud je binární soubor... Je postaven s Thumb a pokud byla podpora povolena NEON, mimo jiné relevantní funkce pro optimalizaci a kompatibilitu.
To vše pomáhá ověřit, zda binární soubor nejen odpovídá očekávané variantě FP, ale také Je v souladu s instrukční sadou a rozšířeními které máte k dispozici na zařízení, kde bude spuštěno.
Příklad doporučeného pracovního postupu
Typická sekvence pro porovnání obou variant knihovny libm.so.6 by mohla být jednoduchá takto: Vypsat trasy, spustit readelf a filtrovat podle FPTakto si na první pohled ukážete klíčový rozdíl mezi armel a 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
Pokud v ARMHF pozorujete linii s Argumenty_tagu_ABI_VFP A protože se to v ARMELu neobjevuje, můžete rozdíl považovat za ověřený. A pokud chcete vidět vše, můžete vždy použít readelf -a pro kompletní výpis záhlaví, sekcí, atributů a symbolů.
Kompilace, ne systém: kdo rozhoduje o ARMEL nebo ARMHF
Je důležité zdůraznit jeden koncept: Varianta ARMEL/ARMHF je určena binárním kódem.Strukturu souboru ELF určuje proces kompilace, nikoli abstraktní „systém“. Pokud kompilujete spustitelný soubor s podporou hard-float, získáte ELF typu ARMHF; jinak to bude ARMEL. Toto rozlišení pramení z procesu sestavení a je pevně zakódováno v atributech ELF.
Z tohoto důvodu, pokud vás znepokojuje rozhodnutí, jakou cestou se ve svém vlastním projektu vydat, je to obvykle jednodušší. vyřešit to při kompilaci s možnostmi kompilátoru a linkeru a s kódem podmíněným preprocesorem. Není běžné chtít za běhu přepínat mezi ARMEL a ARMHF ve stejném binárním souboru. protože zahrnuje různé ABI.
Záhlaví generované Makefile: praktická technika
Pokud chcete, aby spustitelný soubor sám deklaroval svou „identitu“ v době sestavení, velmi užitečnou technikou je generování hlavička z Makefile Během fáze sestavení systém sestavení detekuje, zda kompilujete pro armel nebo armhf, a uloží konstantu do hlavičkového souboru, který je následně zahrnut do zdrojového kódu.
S tímto přístupem může finální binární soubor zpřístupnit například příkaz -verze který vypíše, zda byl konstruován jako ARMEL nebo ARMHF, aniž by bylo nutné cokoli „detekovat“ za běhu. Obecně tento postup lépe odpovídá skutečnosti, že ABI se nastavuje při kompilaci a nemělo by se to dynamicky měnit.
Proč bys to chtěl vědět za běhu?
Ti, kdo si kladou tuto otázku, se někdy snaží přizpůsobit své chování v zápalu dané situace. Realita je ale taková, že Obvyklá praxe je oddělovat kód pomocí direktiv preprocesoru a zkompilovat různé varianty, jednu pro armel a druhou pro armhf. Míchání obou ve stejném artefaktu není realistické, protože každý z nich závisí na vlastní sadě knihoven a jiný ABI.
Obecným doporučením je tedy učinit rozhodnutí před kompilacía za běhu jednoduše ověřte, zda cílové prostředí obsahuje příslušné knihovny pro binární soubor, který se chystáte spustit. Chcete-li auditovat již sestavený binární soubor, readelf Zůstává nejpřímějším nástrojem.
Multiarch: Proč máte arm-linux-gnueabihf i arm-linux-gnueabi
Pokud při výpisu adresářů ve vašem systému vidíte, že máte arm-linux-gnueabihf a arm-linux-gnueabi koexistence nemusí být nutně chyba: to je víceobloukovýUmožňuje paralelní instalaci a používání více architektur nebo variant ABI, což usnadňuje křížové kompilace a testování.
Například v prostředí Debianu byly chvíle, kdy bylo rozhodnuto Odebrat multiarch ve výchozích obrazech Wheezy protože podpora byla zelená a způsobovala více problémů než užitku. Následně Jessie a novější verze vylepšily podporu multiarch, díky čemuž je koexistence armel/armhf životaschopnější bez tolika problémů.
Správná interpretace tras nestačí
Pokud se v souboru /usr/arm-linux-gnueabihf/lib nachází knihovna, naznačuje to, že se jedná o ARMHF, a totéž platí pro soubor /usr/arm-linux-gnueabi/lib pro ARMEL. Ale pokud si chcete být jisti, Otevřete ELF a podívejte se na jeho atributyCesty jsou užitečné jako vodítko, ačkoli ve složitých systémech s více archivy nebo ručními zálohami, může uvést v omyl.
Opět, východ z readelf -A Poskytuje nezvratný důkaz: přítomnost Tag_ABI_VFP_args pro hard-float a jeho absence pro soft-float. Navíc to potvrdí i ostatní příznaky. instrukce a rozšíření které binární soubor může vyžadovat.
Co dalšího se můžete naučit z -A kromě FP
Sekce atributů ARM, která zobrazuje -A, vám nejen říká, zda existuje VFP. Také vám říká, zda binární soubor Je označeno jako Palec, varianta architektury (např. ARMv7) a zda existuje podpora NEONTyto podrobnosti vám pomohou ověřit, zda je binární soubor kompatibilní s cílovým hardwarem, a zabránit překvapením během nasazení.
Vezměme si například validaci běhového prostředí: spolu s ověřením ARMEL vs. ARMHF, Zkontrolujte palec a NEON Může vás upozornit na jemné nesrovnalosti, které nejsou na první pohled viditelné.
Často kladené otázky a rychlé tipy
- Můžu to detekovat bez čtení elfu? Technicky vzato byste to mohli odvodit z cesty nebo z toho, jak byl váš projekt sestaven, ale spolehlivou metodou je prozkoumat soubor ELF. `readelf -A` poskytuje důkazy v samotném binárním souboru.
- Stačí na výjezdu vidět „VFP“? Obecné zmínky o VFP naznačují schopnosti, ale rozhodující je Argumenty_tagu_ABI_VFP v ARMHF. Jeho absence v ARMEL je stejně významná.
- Co když mi můj čtecí modul říká „AAPCS (varianta VFP)“? Je to alternativní forma stejné myšlenky, kterou lze vidět v určitých sestavách, jako jsou ty založené na elftoolchain-0.6.1Může se také objevit „AAPCS (základní varianta)“ nebo „specifické pro danou řadu nástrojů“.
- Proč mám nainstalované obě verze? Por víceobloukovýV některých prostředích je to normální. Jen se ujistěte, že propojujete a spouštíte knihovnu, která odpovídá binárnímu souboru, který používáte.
Stručná poznámka ke zdrojům a jejich financování
Některé technické publikace, které se těmito tématy zabývají, obsahují zprávy pro podporují jejich práci prostřednictvím darů v kryptoměnách, platforem jako Patreon nebo affiliate odkazů na obchody jako Amazon nebo AliExpress. Je to běžná praxe v nezávislých médiích, která někdy Používají partnerské odkazy ve svých článcích, aby získali provizi, pokud po kliknutí provedete nákup.
Mentální kontrolní seznam při auditu binárního kódu
Než přijmete knihovnu nebo spustitelný soubor pro své zařízení, prostudujte si tyto body: dotaz readelf -A, hledá přítomnost nebo nepřítomnost Argumenty_tagu_ABI_VFPPodívejte se na cílovou architekturu a zkontrolujte, zda Thumb a NEON pasují na hardware, na kterém ji budete provozovat.
Pokud pracujete s více toolchainy nainstalovanými přes multiarch, Věnujte zvláštní pozornost trasám Proměnné prostředí kompilátoru a linkeru musí být nakonfigurovány tak, aby se zabránilo směšování hlavičkových souborů a knihoven ARMEL s binárními soubory ARMHF a naopak. Malé přehlédnutí může způsobit problémy. matoucí příznaky v době linkování nebo běhu.
Typické chyby, kterým se vyhnout
Klasickou chybou je být příliš sebevědomý a předpokládat, že knihovna je hard-float, protože je umístěna pod arm-linux-gnueabihf. bez potvrzení atributů ELFDalší častou chybou je pokus o propojení spustitelného souboru ARMHF s knihovnami ARMEL (nebo naopak), což obvykle vede k selhání symbolů nebo podivnému chování.
Je také běžné, že je třeba „detekovat za běhu“, aby se cesty ke knihovnám měnily za chodu. Nezapomeňte, že Volba ARMEL/ARMHF není improvizována za běhuJe to napevno zakódované v binárním souboru. Upravte svá nasazení a balíčky tak, aby každý spustitelný soubor obdržel knihovny pro svou vlastní variantu.
Pokud potřebujete rychlý přehled, zvažte tyto kroky: vyhledejte knihovnu nebo spustitelný soubor (například libm.so.6), spustit readelf -A Pokud chcete jít rovnou k věci, filtrujte v souboru podle FP a zkontrolujte, zda existuje řádek. Argumenty_tagu_ABI_VFP (hard-float) nebo pokud chybí (soft-float). Poté zkontrolujte architekturu, Thumb a NEON pro dokončení binárního profilu.
Při porovnávání ARMEL a ARMHF ve stejném systému, pamatujte na kontext více oblouků A skutečnost, že klíčový rozdíl spočívá v ABI s plovoucí desetinnou čárkou definovaném standardem AAPCS, spočívá v tom, že z tohoto pohledu se interpretace atributů readelf stává rychlým a přesným cvičením.
Je jasné, že se správným nástrojem a s vědomím, kde hledat, Určení, zda je ARM ELF ARMHF nebo ARMEL, je otázkou sekund.Klíčem je identifikovat atribut Tag_ABI_VFP_args pro hard-float a využít readelf -A k získání dalšího kontextu o architektuře, Thumb a NEON. S ohledem na specifika multiarch a na to, že volba ABI je pevně stanovena při kompilaci, Vyhnete se zmatkům a ušetříte čas při ověřování binárních souborů a knihoven ve vašich projektech.