Apabila bekerja dengan boleh laku dan perpustakaan untuk ARM, lambat laun persoalan timbul: Adakah ia disusun dengan terapung keras (ARMHF) atau dengan terapung lembut (ARMEL)? Perbezaannya adalah ketara, kerana ia mempengaruhi keserasian dan prestasi binari dalam operasi titik terapung. Nasib baik, binari ELF itu sendiri mengandungi petunjuk yang diperlukan untuk menentukan ini dengan pasti.
Dalam artikel ini kami menyemak cara untuk memeriksa ARM ELF menggunakan utiliti baca sendiri Untuk membezakan antara kedua-dua varian, kami akan merangkumi label yang hendak dicari, perbezaan output yang mungkin anda temui bergantung pada versi alat dan cara mentafsir butiran seperti Thumb atau NEON. Kami juga akan membincangkan sebab keputusan ARMEL lwn. ARMHF dibuat semasa penyusunan. bukan dalam sistem runtimedan kami menjelaskan keraguan umum tentang persekitaran multiarch di mana arm-linux-gnueabihf dan arm-linux-gnueabi wujud bersama.
Apakah maksud ARMHF (terapung keras) dan ARMEL (terapung lembut)?
Tingkah laku ini ditakrifkan oleh AAPCS (ARM Architecture Procedure Call Standard), yang menerangkan cara parameter diluluskan dan nilai dikembalikan. AAPCS mempunyai varianDan yang menarik minat kita untuk membezakan ARMHF ialah yang dikaitkan dengan VFP, penunjuk yang akan kita lihat ditunjukkan dalam atribut binari.
ELF dan tajuknya: mengapa ia memberi kita semua maklumat
ELF (Format Boleh Laksana dan Boleh Paut) ialah standard de facto dalam Linux dan menyimpan data dalam bahagian pengepala dan atributnya. maklumat tentang seni bina sasaran dan konvensyen ABI yang digunakan untuk menyusun boleh laku atau perpustakaan. Jika anda berminat dengan perincian yang menyeluruh, cuma cari spesifikasi pengepala ELF untuk melihat semua medan yang wujud.
Untuk memeriksa ELF, alat itu baca sendiri Ia adalah laluan langsung. Pilihan -a membalikkan hampir segala-galanya, dan pilihan -A membenarkan fokus pada maklumat yang bergantung kepada seni bina (ARM dalam kes kami), menunjukkan atribut seperti jenis titik terapung, sama ada Thumb didayakan, sokongan NEON dan bendera lain yang berkaitan.
Sediakan persekitaran dengan ARMEL dan ARMHF
Jika anda ingin membandingkan output dunia sebenar, cara yang praktikal ialah memasang rantai alat gcc/g++ untuk kedua-dua varian pada mesin Ubuntu. Dengan berbuat demikian, Anda akan mendapat perpustakaan sistem untuk armel dan armhf dipasang bersebelahan terima kasih kepada multiarch.
Selepas pemasangan, laluan perpustakaan biasa ialah: /usr/arm-linux-gnueabihf/lib untuk ARMHF y /usr/arm-linux-gnueabi/lib untuk ARMELMempunyai kedua-duanya membolehkan anda membandingkan, sebagai contoh, perpustakaan matematik libm.so.6 dan memerhatikan bagaimana sifat berubah bergantung pada varian.
Petunjuk muktamad: Tag_ABI_VFP_args dengan readelf
Ujian praktikal melibatkan menganalisis ELF dengan readelf dan mencari rujukan kepada FP dalam atribut. Taktik yang sangat mudah adalah untuk menapis output dengan rentetan FP untuk memfokuskan pada nombor titik terapung. kerana penunjuk yang paling mendedahkan ialah atribut Tag_ABI_VFP_args.
Dalam pustaka libm.so.6 yang disusun sebagai ARMEL (soft-float), anda akan melihat atribut ARM biasa, tetapi Baris Tag_ABI_VFP_args tidak akan munculSebaliknya, dalam fail libm.so.6 ARMHF (hard-float), baris tambahan dengan atribut itu akan dipaparkan, mengesahkan penggunaan konvensyen panggilan VFP.
readelf -A /usr/arm-linux-gnueabi/lib/libm.so.6 | grep FP
Dalam ARMEL, penapisan oleh FP akan menunjukkan maklumat yang berkaitan dengan keupayaan titik terapung umum, tetapi tanpa atribut yang mengisytiharkan argumen VFPApabila mengulanginya melalui ARMHF:
readelf -A /usr/arm-linux-gnueabihf/lib/libm.so.6 | grep FP
Anda akan menemui entri tambahan jenis Tag_ABI_VFP_args yang merupakan tanda yang tidak dapat disangkal tentang apungan keras. Perincian ini, dalam praktiknya, Ini membolehkan kami menyatakan dengan pasti bahawa binari mengikut terapung keras ABI.
Variasi output bergantung pada versi readelf
Bergantung pada pelaksanaan dan versi readelf, bentuk sebenar teks mungkin berbeza-beza. Sebagai contoh, dengan readelf disusun daripada elftoolchain-0.6.1Baris tambahan bukan sahaja menunjukkan atribut, tetapi boleh diterangkan sebagai: Tag_ABI_VFP_args: AAPCS (varian VFP).
Dalam keluarga output yang sama, terdapat dua nilai lain yang mungkin muncul untuk Tag_ABI_VFP_args: "AAPCS (varian asas)" dan "khusus rantaian alat"Literatur yang ada menyebut alternatif-alternatif ini, walaupun tidak selalu jelas dalam keadaan yang tepat setiap satu dikembalikan. Yang penting ialah mengenalinya sebutan tentang varian VFP Ia dikaitkan dengan kes terapung keras.
Di luar latihan vokasional: -A juga mengajar seni bina, Thumb dan NEON
Walaupun di sini kami memberi tumpuan kepada membezakan antara ARMHF dan ARMEL, ia patut diingati baca sendiri -A Ia menawarkan pandangan yang lebih luas tentang binari. Outputnya akan menunjukkan, sebagai tambahan kepada atribut titik terapung, seni bina sasaran yang tepat, jika binari Ia dibina dengan Thumb dan jika sokongan telah didayakan NEON, antara keupayaan lain yang berkaitan untuk pengoptimuman dan keserasian.
Semua ini membantu mengesahkan bahawa binari bukan sahaja sepadan dengan varian FP yang anda harapkan, tetapi juga Ia sejajar dengan set arahan dan sambungan yang anda ada pada peranti yang akan dijalankan.
Contoh aliran kerja yang disyorkan
Urutan biasa untuk membandingkan kedua-dua varian libm.so.6 boleh semudah ini: Senaraikan laluan, jalankan readelf dan tapis mengikut FPIni akan memberi anda perbezaan utama antara armel dan armhf sepintas lalu.
# 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
Jika dalam ARMHF anda perhatikan garisan dengan Tag_ABI_VFP_args Dan kerana ia tidak muncul dalam ARMEL, anda boleh menganggap perbezaan itu disahkan. Dan jika anda lebih suka melihat segala-galanya, anda sentiasa boleh menggunakannya baca sendiri -a untuk pembuangan lengkap pengepala, bahagian, atribut dan simbol.
Kompilasi, bukan sistem: siapa yang memutuskan ARMEL atau ARMHF
Adalah penting untuk menekankan satu konsep: Varian ARMEL/ARMHF ditentukan oleh kod binari.Proses penyusunan yang menentukan struktur fail ELF, bukan "sistem" abstrak. Jika anda menyusun boleh laku anda dengan sokongan terapung keras, anda akan mendapat ARMHF ELF; jika tidak, ia akan menjadi ARMEL. Perbezaan ini berpunca daripada proses binaan dan dikodkan keras dalam atribut ELF.
Atas sebab itu, jika perkara yang membimbangkan anda ialah memutuskan jalan mana yang hendak diambil dalam projek anda sendiri, ia biasanya lebih mudah. menyelesaikannya pada masa penyusunan dengan pilihan pengkompil dan pemaut, dan dengan kod bersyarat prapemproses. Ia bukan perkara biasa untuk menukar antara ARMEL dan ARMHF dalam binari yang sama pada masa jalan. kerana ia melibatkan ABI yang berbeza.
Pengepala yang dihasilkan oleh Makefile: teknik praktikal
Jika anda mahu executable itu sendiri mengisytiharkan "identiti"nya pada masa binaan, teknik yang sangat berguna adalah untuk menjana pengepala daripada Makefile Semasa fasa binaan, sistem binaan mengesan sama ada anda sedang menyusun untuk armel atau armhf dan membuang pemalar ke dalam fail pengepala, yang kemudiannya disertakan dalam kod sumber.
Dengan pendekatan itu, binari akhir boleh mendedahkan, sebagai contoh, arahan -versi yang mencetak sama ada ia dibina sebagai ARMEL atau ARMHF, tanpa perlu "mengesan" apa-apa semasa masa jalan. Secara umum, amalan ini lebih sesuai dengan fakta bahawa ABI ditetapkan semasa menyusun dan ia tidak sepatutnya berubah secara dinamik.
Mengapa anda ingin mengetahuinya pada masa jalan?
Mereka yang bertanya soalan ini kadang-kadang cuba menyesuaikan tingkah laku mereka dalam keadaan panas. Tetapi realitinya begitu Amalan biasa ialah memisahkan kod menggunakan arahan prapemproses dan susun varian yang berbeza, satu untuk armel dan satu lagi untuk armhf. Mencampurkan kedua-duanya dalam artifak yang sama adalah tidak realistik, kerana setiap satu bergantung pada set perpustakaannya sendiri dan ABI yang berbeza.
Oleh itu cadangan umum adalah untuk membuat keputusan sebelum menyusundan pada masa jalanan, hanya sahkan bahawa persekitaran sasaran mempunyai perpustakaan yang sesuai untuk binari yang akan anda lancarkan. Untuk mengaudit binari yang telah dibina, baca sendiri Ia kekal sebagai alat yang paling langsung.
Multiarch: Mengapa anda mempunyai kedua-dua arm-linux-gnueabihf dan arm-linux-gnueabi
Jika apabila menyenaraikan direktori pada sistem anda, anda melihat bahawa anda mempunyai arm-linux-gnueabihf dan arm-linux-gnueabi wujud bersama tidak semestinya satu kesilapan: iaitu multiarchIa membolehkan anda memasang dan menggunakan berbilang seni bina atau varian ABI secara selari, memudahkan penyusunan silang dan ujian.
Dalam persekitaran Debian, sebagai contoh, ada kalanya ia diputuskan Alih keluar multiarch dalam imej Wheezy lalai kerana sokongan adalah hijau dan menyebabkan lebih banyak masalah daripada faedah. Selepas itu, Jessie dan versi terkemudian menambah baik sokongan multiarch, menjadikan kewujudan bersama armel/armhf lebih berdaya maju tanpa banyak sakit kepala.
Mentafsir laluan dengan betul tidak mencukupi
Melihat perpustakaan dalam /usr/arm-linux-gnueabihf/lib mencadangkan ia adalah ARMHF, dan sama dengan /usr/arm-linux-gnueabi/lib untuk ARMEL. Tapi kalau nak kepastian, Buka ELF dan lihat atributnyaLaluan ini berguna sebagai panduan, walaupun dalam sistem yang kompleks dengan berbilang arkib atau sandaran manual, boleh menyesatkan.
Sekali lagi, keluar dari baca sendiri -A Ia memberikan bukti muktamad: kehadiran Tag_ABI_VFP_args untuk terapung keras, dan ketiadaannya untuk terapung lembut. Tambahan pula, bendera lain akan menyokong ini. arahan dan sambungan yang mungkin memerlukan perduaan.
Apa lagi yang anda boleh belajar daripada -A, selain FP
Bahagian atribut ARM yang menunjukkan -A bukan sahaja memberitahu anda jika terdapat VFP. Ia juga memberitahu anda jika binari Ia ditandakan sebagai Ibu Jari, varian seni bina (cth., ARMv7), dan sama ada terdapat sokongan NEONButiran ini membantu anda mengesahkan bahawa binari itu serasi dengan perkakasan sasaran dan mengelakkan kejutan semasa penggunaan.
Pertimbangkan, sebagai contoh, mengesahkan persekitaran masa jalan: bersama-sama dengan mengesahkan ARMEL vs ARMHF, Semak Ibu Jari dan NEON Ia boleh memberi amaran kepada anda tentang ketidakserasian halus yang tidak kelihatan pada pandangan pertama.
Soalan Lazim dan Petua Pantas
- Bolehkah saya mengesannya tanpa membaca sendiri? Secara teknikal, anda boleh membuat kesimpulan dari laluan atau cara projek anda sendiri dibina, tetapi kaedah yang kukuh adalah untuk memeriksa fail ELF. `readelf -A` menyediakan bukti dalam binari itu sendiri.
- Adakah cukup untuk melihat "VFP" di pintu keluar? Melihat rujukan umum kepada VFP menunjukkan keupayaan, tetapi garis penentunya ialah Tag_ABI_VFP_args dalam ARMHF. Ketiadaannya dalam ARMEL adalah sama penting.
- Bagaimana jika pembaca saya sendiri mengatakan "AAPCS (varian VFP)"? Ia merupakan bentuk alternatif bagi idea yang sama yang dilihat dalam binaan tertentu, seperti yang berdasarkan elftoolchain-0.6.1"AAPCS (varian asas)" atau "khusus rantaian alat" juga mungkin muncul.
- Mengapa saya memasang kedua-dua versi? Oleh multiarchIni adalah perkara biasa dalam sesetengah persekitaran. Cuma pastikan anda memaut dan menjalankan dengan set perpustakaan yang sepadan dengan binari yang anda gunakan.
Nota ringkas mengenai sumber dan pembiayaan mereka
Beberapa penerbitan teknikal yang menangani topik ini termasuk mesej untuk menyokong kerja mereka melalui derma mata wang kripto, platform seperti Patreon, atau pautan ahli gabungan ke kedai seperti Amazon atau AliExpress. Ia adalah amalan biasa dalam media bebas, yang kadangkala Mereka menggunakan pautan gabungan dalam artikel mereka untuk mendapatkan komisen jika anda membuat pembelian selepas mengklik.
Senarai semak mental semasa mengaudit binari
Sebelum menerima pustaka atau boleh laku untuk peranti anda, semak perkara ini: pertanyaan readelf -A, mencari ada atau tidaknya Tag_ABI_VFP_argsLihat seni bina sasaran, dan semak sama ada Thumb dan NEON sesuai dengan perkakasan yang akan anda gunakan.
Jika anda bekerja dengan berbilang rantai alat yang dipasang melalui multiarch, Beri perhatian khusus kepada laluan Pembolehubah persekitaran pengkompil dan pemaut mesti dikonfigurasikan untuk mengelakkan pencampuran pengepala dan perpustakaan ARMEL dengan binari ARMHF, atau sebaliknya. Kelalaian kecil boleh menyebabkan masalah. gejala mengelirukan pada masa pautan atau masa jalan.
Kesilapan biasa yang perlu dielakkan
Kesilapan klasik ialah terlalu yakin dan menganggap bahawa perpustakaan adalah terapung kerana ia terletak di bawah arm-linux-gnueabihf, tanpa mengesahkan sifat ELFSatu lagi kesilapan biasa ialah cuba memautkan ARMHF boleh laku dengan perpustakaan ARMEL (atau sebaliknya), yang biasanya mengakibatkan kegagalan simbol atau tingkah laku pelik.
Ia juga biasa untuk "mengesan pada masa jalan" untuk menukar laluan perpustakaan dengan cepat. Ingat tu Pilihan ARMEL/ARMHF tidak diubahsuai pada masa tayanganIa dikodkan keras ke dalam binari. Laraskan penggunaan dan pakej anda supaya setiap boleh laku menerima perpustakaan untuk variannya sendiri.
Jika anda memerlukan rujukan pantas, fikirkan langkah ini: cari pustaka atau boleh laku (contohnya, libm.so.6), melancarkan readelf -A Terhadap fail, tapis mengikut FP jika anda mahu terus ke intinya dan semak jika terdapat garisan Tag_ABI_VFP_args (hard-float) atau jika tiada (soft-float). Kemudian, semak seni bina, Ibu Jari dan NEON untuk melengkapkan profil binari.
Apabila membandingkan ARMEL dan ARMHF dalam sistem yang sama, ingat konteks multiarch Dan hakikat bahawa perbezaan utama terletak pada ABI titik terapung yang ditakrifkan oleh AAPCS. Dari perspektif itu, mentafsir atribut readelf menjadi latihan yang cepat dan tepat.
Adalah jelas bahawa, dengan alat yang betul dan mengetahui di mana hendak mencari, Menentukan sama ada ARM ELF ialah ARMHF atau ARMEL hanya memerlukan beberapa saatKuncinya ialah mengenal pasti atribut Tag_ABI_VFP_args untuk hard-float dan memanfaatkan readelf -A untuk mendapatkan konteks tambahan tentang seni bina, Thumb dan NEON. Mengingati keistimewaan multiarch dan pilihan ABI ditetapkan semasa penyusunan, Anda akan mengelakkan kekeliruan dan menjimatkan masa apabila mengesahkan binari dan perpustakaan dalam projek anda.