首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确定Linux中二进制文件的目标ISA扩展名(库或可执行文件)

确定Linux中二进制文件的目标ISA扩展名(库或可执行文件)
EN

Stack Overflow用户
提问于 2008-11-06 08:29:28
回答 6查看 79.4K关注 0票数 60

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

威盛C3处理器应该是兼容i686的。不久前,在使用相同处理器的MiniItx板上安装了Ubuntu6.10之后,我发现前面的说法并不是100%正确的。Ubuntu内核在启动时挂起,原因是C3处理器中的i686集缺少一些特定的和可选的指令。这些指令在i686 set的C3实现中缺失,在使用i686优化时,默认情况下由GCC编译器使用。在这种情况下,解决方案是使用Ubuntu发行版的i386编译版本。

Java应用程序的基本问题是,FC3发行版是通过从另一台PC (这次是英特尔P4 )的HD映像克隆而安装在HD上的。之后,这个发行版需要一些破解才能运行,比如用i386编译版本替换一些包(比如内核包)。

问题是,在工作一段时间后,系统完全挂起,没有任何痕迹。我担心一些i686代码会留在系统的某个地方,随时可能被随机执行(例如,在从挂起模式或类似的模式中恢复后)。

我的问题是:

  • 有没有什么工具或方法可以找出二进制文件(可执行文件或库)需要哪些特定的体系结构扩展名?file没有提供足够的信息。
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-06 08:36:28

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

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

票数 17
EN

Stack Overflow用户

发布于 2010-05-25 15:04:52

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

票数 112
EN

Stack Overflow用户

发布于 2014-07-04 23:10:45

我决定为任何来到这里的人再添加一个解决方案:就我个人而言,fileobjdump提供的信息还不够,grep也帮不了什么忙--我通过readelf -a -W解决了我的问题。

注意,这给了你相当多的信息。与arch相关的信息位于最开始和最末。下面是一个例子:

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
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/267941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档