Определение целевых расширений 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 53

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.

расширяя ответ @Hi-Angel, я нашел простой способ проверить разрядность статической библиотеки:

readelf -a -W libsomefile.a | grep Class: | sort | uniq

здесь libsomefile.a Это моя статическая библиотека. Должен работать и для других файлов ELF.

быстрее всего найти архитектуру было бы выполнить:

objdump -f testFile | grep architecture

это работает даже для бинарных.