У меня нет доступа к команде сборки, у меня просто есть библиотека в моей системе.
Я думаю, я мог бы создать исполняемый файл hardfp, который ссылается на него и тестирует, но мне интересно, есть ли более простой способ.
У меня нет доступа к команде сборки, у меня просто есть библиотека в моей системе.
Я думаю, я мог бы создать исполняемый файл hardfp, который ссылается на него и тестирует, но мне интересно, есть ли более простой способ.
Выполнить readelf -A library.so
: если в списке печатных тегов содержится Tag_ABI_VFP_args: VFP registers
, то это двоичный файл hardfp
, в противном случае - softfp
.
например. readelf -A /lib/arm-linux-gnueabihf/libm.so.6
будет производить
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_ABI_optimization_goals: Aggressive Speed
Tag_CPU_unaligned_access: v6
С другой стороны, readelf -A /lib/arm-linux-gnueabi/libm.so.6
производит
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_optimization_goals: Aggressive Speed
Tag_CPU_unaligned_access: v6
Используйте readelf
.
Вот пример выходных данных одной сборки ARM Poco:
$ readelf libPocoFoundation.so -h
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2 complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM
Version: 0x1
Entry point address: 0x61e50
Start of program headers: 52 (bytes into file)
Start of section headers: 1078048 (bytes into file)
Flags: 0x5000402, has entry point, Version5 EABI, hard-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 28
Section header string table index: 27
В разделе флагов будут перечислены данные о файле elf. Они определены в спецификации ARM ELF, проверьте таблицу 4-2. В моем случае это было сделано с помощью компилятора hard float, поэтому hard-float указан как флаг.
В библиотеке с плавающей точкой строка флагов выглядит следующим образом:
Flags: 0x5000202, has entry point, Version5 EABI, soft-float ABI
Используйте objdump -d
для демонтажа, затем grep для некоторых команд с плавающей запятой. Я не уверен, будет ли objdump создавать UAL-совместимую сборку, поэтому попробуйте старый синтаксис. Возможно, будет еще проще наблюдать за именами регистров, а не с помощью мнемоники, но могут быть ложные срабатывания.