Определение целевых расширений ISA двоичного файла в Linux (библиотека или исполняемый файл)
У нас есть проблема, связанная с Java-приложением, работающим под (довольно старым) FC3 на плате Advantech POS с процессором Via C3. Приложение java имеет несколько скомпилированных общих библиотек, доступ к которым осуществляется через JNI.
процессор Via C3 должен быть совместим с i686. Некоторое время назад после установки Ubuntu 6.10 на плате MiniItx с тем же процессором я обнаружил, что предыдущее утверждение не соответствует 100% истине. Ядро Ubuntu зависло при запуске из-за отсутствия некоторых конкретные и дополнительные инструкции i686, установленные в процессоре C3. Эти инструкции, отсутствующие в реализации C3 набора i686, по умолчанию используются компилятором GCC при использовании оптимизаций i686. В этом случае решение должно было идти с i386 скомпилированной версией дистрибутива Ubuntu.
основная проблема с Java-приложением заключается в том, что дистрибутив FC3 был установлен на HD путем клонирования из образа HD другого ПК, на этот раз Intel P4. Затем дистрибутив нуждался в некотором взломе, чтобы он работал, например, заменяя некоторые пакеты (например, ядро) на скомпилированную версию i386.
проблема в том, что поработав некоторое время система полностью зависает без следа. Я боюсь, что какой-то код i686 остается где-то в системе и может быть выполнен случайным образом в любое время (например, после восстановления из режима приостановки или что-то в этом роде).
мой вопрос:
- Is существует ли какой-либо инструмент или способ узнать, на каких конкретных расширениях архитектуры требуется двоичный файл (исполняемый файл или библиотека)?
file
не дает достаточно информации.
6 ответов:
Я думаю, вам нужен инструмент, который проверяет каждую инструкцию, чтобы точно определить, какой набор он принадлежит. Есть ли даже официальное название для конкретного набора инструкций, реализованных процессором C3? Если нет, то еще более волосатый.
вариант quick'n'Dirty может заключаться в том, чтобы выполнить необработанный поиск в файле, если вы можете определить битовый шаблон запрещенных инструкций. Просто тест для них напрямую, может быть сделано простым
unix.linux
file
команда отлично подходит для этого. Он может обычно обнаруживать целевую архитектуру и операционную систему для данного двоичного файла (и поддерживается и выключается с 1973 года. Ух ты!)конечно, если вы не работаете под unix/linux - вы немного застряли. В настоящее время я пытаюсь найти порт на основе java, который я могу вызвать во время выполнения.. но не тут-то было.
unix
file
команда дает такую информацию:hex: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.17, not stripped
больше подробная информация о деталях архитектуры намекается с помощью (unix)
objdump -f <fileName>
команда, которая возвращает:architecture: arm, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x0000876c
этот исполняемый файл был скомпилирован кросс-компилятором gcc (скомпилирован на машине i86 для процессора ARM в качестве цели)
я решил добавить еще одно решение для любого, кто попал сюда: лично в моем случае, если информации, представленной
file
иobjdump
не хватило, а тоgrep
не очень помогает - я решаю свое дело черезreadelf -a -W
.обратите внимание, что это дает вам довольно много информации. Информация, связанная с аркой, находится в самом начале и в самом конце. Вот пример:
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x83f8 Start of program headers: 52 (bytes into file) Start of section headers: 2388 (bytes into file) Flags: 0x5000202, has entry point, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 31 Section header string table index: 28 ... Displaying notes found at file offset 0x00000148 with length 0x00000020: Owner Data size Description GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) OS: Linux, ABI: 2.6.16 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 Tag_Advanced_SIMD_arch: NEONv1 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_rounding: Needed 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_CPU_unaligned_access: v6
чтобы ответить на двусмысленность того, является ли Via C3 процессором класса i686: это не так, это процессор класса i586.
Cyrix никогда не производила настоящий процессор класса 686, несмотря на их маркетинговые претензии с частями 6x86MX и MII. Среди других отсутствующих инструкций, два важных, которых у них не было, были CMPXCHG8b и CPUID, которые требовались для запуска Windows XP и выше.
National Semiconductor, AMD и VIA имеют все произведенные конструкции процессора на основе Cyrix 5x86 / 6x86 core (NXP MediaGX, AMD Geode, VIA C3/C7, VIA Corefusion и др.) которые привели к странным конструкциям, где у вас есть процессор класса 586 с наборами инструкций SSE1/2/3.
моя рекомендация, если вы столкнетесь с любым из процессоров, перечисленных выше, и это не для старинного компьютерного проекта (т. е. Windows 98SE и ранее), а затем бегите от него с криком. Вы застряли на медленном i386 / 486 Linux или должны перекомпилировать все свое программное обеспечение с помощью специальных оптимизаций Cyrix.