60

我们有一个与在带有 Via C3 处理器的 Advantech POS 板上的(相当旧的)FC3 下运行的 Java 应用程序相关的问题。Java 应用程序有几个通过 JNI 访问的已编译共享库。

Via C3 处理器应该与 i686 兼容。前段时间在具有相同处理器的 MiniItx 板上安装 Ubuntu 6.10 后,我发现前面的说法并非 100% 正确。由于缺少C3处理器中设置的i686的一些特定和可选指令,Ubuntu内核在启动时挂起。在使用 i686 优化时,GCC 编译器默认使用 i686 集的 C3 实现中缺少的这些指令。在这种情况下,解决方案是使用 i386 编译版本的 Ubuntu 发行版。

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 交叉编译器编译(在 i86 机器上编译,以 ARM 处理器为目标)

于 2010-05-25T07:04:51.533 回答
31

我决定为任何来到这里的人添加一个解决方案:就我个人而言,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
于 2014-07-04T15:10:44.603 回答
17

我认为您需要一个工具来检查每条指令,以确定它属于哪个集合。C3 处理器实现的特定指令集是否有正式名称?如果没有,那就更毛了。

如果您可以确定不允许的指令的位模式,那么快速的变体可能是在文件中进行原始搜索。只需直接测试它们,例如可以通过简单的objdump | grep链来完成。

于 2008-11-06T08:36:28.057 回答
5

要回答 Via C3 是否是 i686 级处理器的歧义:不是,它是 i586 级处理器。

Cyrix 从未生产过真正的 686 级处理器,尽管他们在市场上声称使用 6x86MX 和 MII 部件。在其他缺失的指令中,他们没有的两个重要指令是 CMPXCHG8b 和 CPUID,它们是运行 Windows XP 及更高版本所必需的。

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 回答