60

Via C3 プロセッサを搭載した Advantech POS ボード上の (かなり古い) FC3 で実行されている Java アプリケーションに関連する問題があります。Java アプリケーションには、JNI 経由でアクセスされるコンパイル済みの共有ライブラリがいくつかあります。

C3 プロセッサ経由は i686 と互換性があるはずです。少し前に、同じプロセッサを搭載した MiniItx ボードに Ubuntu 6.10 をインストールした後、前の説明が 100% 真実ではないことがわかりました。Ubuntu カーネルは、C3 プロセッサに設定された i686 のいくつかの特定のオプション命令が不足しているため、起動時にハングアップしました。i686 セットの C3 実装にないこれらの命令は、i686 最適化を使用する場合、GCC コンパイラによってデフォルトで使用されます。この場合の解決策は、Ubuntu ディストリビューションの i386 コンパイル バージョンを使用することでした。

Java アプリケーションの基本的な問題は、FC3 ディストリビューションが別の PC (今回は Intel P4) の HD のイメージから複製することによって HD にインストールされたことです。その後、ディストリビューションを実行するには、いくつかのパッケージ (カーネルのものなど) を i386 コンパイル済みバージョンに置き換えるなど、いくつかのハッキングが必要でした。

問題は、しばらく作業した後、システムが跡形もなく完全にハングすることです。いくつかの i686 コードがシステムのどこかに残っていて、いつでもランダムに実行される可能性があるのではないかと心配しています (たとえば、サスペンド モードからの回復後など)。

私の質問は:

  • バイナリ ファイル (実行可能ファイルまたはライブラリ) が必要とする特定のアーキテクチャ拡張機能を確認するツールまたは方法はありますか? file十分な情報を提供しません。
4

6 に答える 6

113

unix.linuxfileコマンドはこれに最適です。一般に、特定のバイナリのターゲット アーキテクチャとオペレーティング システムを検出できます (1973 年以来、オンとオフが維持されています。すごい!)

もちろん、unix/linux で実行していない場合は、少し行き詰っています。私は現在、実行時に呼び出すことができるJavaベースのポートを見つけようとしています..しかし、そのような運はありません。

unixfileコマンドは、次のような情報を提供します。

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 クロス コンパイラによってコンパイルされました (ターゲットとして ARM プロセッサ用に i86 マシンでコンパイルされました)。

于 2010-05-25T07:04:51.533 に答える
31

ここにたどり着いた人のために、もう 1 つの解決策を追加することにしfileました。objdumpgrepreadelf -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
于 2014-07-04T15:10:44.603 に答える
17

どのセットに属しているかを正確に判断するには、すべての命令をチェックするツールが必要だと思います。C3 プロセッサによって実装される特定の命令セットの正式な名前はありますか? そうでない場合は、さらに毛深いです。

許可されていない命令のビット パターンを特定できる場合は、ファイル内で生の検索を実行するのが手っ取り早い方法です。objdump | grepそれらを直接テストするだけで、たとえば単純なチェーンで実行できます。

于 2008-11-06T08:36:28.057 に答える
5

Via C3 が i686 クラ​​スのプロセッサであるかどうかのあいまいさに答えるには、そうではありません。i586 クラ​​スのプロセッサです。

Cyrix は、6x86MX および MII パーツに関するマーケティングの主張にもかかわらず、真の 686 クラ​​ス プロセッサを製造したことはありません。欠落している他の命令の中で、彼らが持っていなかった 2 つの重要な命令は、Windows XP 以降を実行するために必要な CMPXCHG8b と CPUID でした。

National Semiconductor、AMD、および VIA はすべて、Cyrix 5x86/6x86 コア (NxP MediaGX、AMD Geode、VIA C3/C7、VIA Corefusion など) に基づく CPU 設計を作成しており、586 クラ​​スのプロセッサを搭載した奇妙な設計になっています。 SSE1/2/3 命令セットを使用。

上記の CPU のいずれかに出くわし、それがビンテージ コンピューター プロジェクト (つまり、Windows 98SE 以前) 用ではない場合は、それから離れて叫ぶことをお勧めします。遅い i386/486 Linux で立ち往生するか、Cyrix 固有の最適化を使用してすべてのソフトウェアを再コンパイルする必要があります。

于 2015-11-28T17:07:29.110 に答える
4

@Hi-Angel の回答を拡張すると、静的ライブラリのビット幅を確認する簡単な方法が見つかりました。

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

libsomefile.a私の静的ライブラリはどこにありますか。他の ELF ファイルでも機能するはずです。

于 2015-05-11T19:50:35.183 に答える
3

アーキテクチャを見つける最も簡単なことは、実行することです。

objdump -f testFile | grep architecture

これはバイナリでも機能します。

于 2017-05-26T12:22:06.690 に答える