一尘不染

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

linux

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

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

Java应用程序的基本问题是,通过从另一台PC(这次是Intel
P4)的HD映像中进行克隆,将FC3发行版安装在HD上。之后,该发行版需要进行一些修改才能使其运行,例如用i386编译版本替换某些软件包(例如内核)。

问题是,工作一段时间后,系统完全挂起,没有任何痕迹。恐怕某些i686代码会留在系统中的某个位置,并且可以在任何时间随机执行(例如,从挂起模式恢复后)。

我的问题是:

  • 是否有任何工具或方法可以找出二进制文件(可执行文件或库文件)对特定体系结构扩展的要求?file没有提供足够的信息。

阅读 451

收藏
2020-06-07

共1个答案

一尘不染

我认为您需要一个检查每条指令的工具,以准确确定该指令属于哪个指令集。C3处理器实现的特定指令集甚至没有正式名称吗?如果没有,它甚至更毛。

如果您可以确定不允许使用的指令的位模式,则可能会在文件中进行原始搜索,这是一种快速的’n’dirty变体。例如,只需直接测试它们,就可以通过一个简单的objdump | grep链来完成。

2020-06-07