【问题标题】:Apart from "bitness", are .dll files specific to machine/processor type in some way?除了“位数”之外,.dll 文件是否以某种方式特定于机器/处理器类型?
【发布时间】:2015-12-18 09:27:12
【问题描述】:

我正在开发一个加载本地库文件以执行一些计算的 Java 应用程序。应用程序使用 JNI 加载库。此应用程序应可在 Windows 和 Linux 环境(32 位和 64 位)上运行。

在编译过程中,我们将 C 代码编译为库文件(Windows 为 32 位和 64 位 dll,Linux 环境为 32 位和 64 位 .so 文件)。这些 .dll 和 .so 文件包含在分发文件中,并在使用 -Djava.library.path 参数调用 Java 时被引用。

我现在正在几台不同的机器上测试该应用程序。我最初专注于 64 位 Windows 环境。我遇到的奇怪的事情是,在一些 64 位机器上,应用程序成功加载了正确的 .dll 文件,但在其他一些机器上却没有加载 .dll。

我认为问题可能是因为机器之间的处理器类型不同(即 dll 是为一种处理器类型编译的,而其他处理器类型不能使用它们)。

但是,它可以在一台机器上运行,而不能在具有相同处理器的另一台机器上运行:

它可以在运行 Windows 7 64 位的 HP 笔记本电脑上运行,使用此处理器:

PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 5, GenuineIntel

它不适用于运行 Window 7 64 位、配备此处理器的联想笔记本电脑:

PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel

我的问题是:除了位数之外,.dlls 机器/处理器类型是否以其他方式特定? (我知道.dll文件必须匹配机器的位数,JVM也必须匹配.dll文件的位数)

或者理论上,如果 .dll 是 64 位的,它应该在每台使用 64 位 JVM 的 64 位机器上运行吗?

【问题讨论】:

  • 我很困惑。 64位JVM用来把C文件编译成64位dll?虽然 Andrew 原则上是正确的,但只需指示您的 C 编译器为您支持的最低 CPU(或所有 x86_64 CPU)生成代码,并避免在您支持的最低版本 Windows 之后引入操作系统调用。

标签: dll linker java-native-interface processor building


【解决方案1】:

除了位数之外,.dll 机器/处理器类型是否以其他方式特定?

非常喜欢。任何编译的二进制要在操作系统下运行都是特定于处理器和操作系统的,有时甚至是每个特定版本。

不同的处理器——即使在同一个系列中,例如“x86”——也可以提供不同的指令集和功能。有关仅 x86 指令集和功能的不同变体的列表,请参阅 https://en.wikipedia.org/wiki/X86_instruction_listings。如果编译后的二进制文件使用特定指令,则它不会在未实现该指令的处理器上运行。例如,如果一个二进制文件被编译为使用 SSE3 指令,它将无法在没有实现 SSE3 的处理器上运行。

而且它也不仅限于硬件。操作系统的细节对于初学者来说也很重要,因为操作系统是运行进程的开始。所以二进制文件需要在启动它的操作系统的条件和环境中工作。设计为在操作系统下工作的二进制文件还需要调用该操作系统以与数据、设备或其他进程进行交互。不同的操作系统以截然不同的方式提供这些功能,甚至同一基本操作系统的不同版本以不兼容的方式提供这些功能。

而且不是为在操作系统下运行而设计的二进制文件必须提供非常特定于硬件的功能 - 有没有注意到任何操作系统有多少设备驱动程序?这不包括任何共享对象或 DLL,因为根据定义,它们已经设计为在操作系统下运行。

或者理论上,如果 .dll 是 64 位的,它应该在每个 64 位上运行 使用 64 位 JVM 的机器?

现在应该很清楚答案是“甚至没有接近”。

【讨论】:

  • 您好,感谢您的回答。你的回答证实了我的想法。我想我们能做的最好的事情就是为最常见的处理器生成 dll。但我不清楚如何识别不同的处理器。例如,在我在问题中提到的两台笔记本电脑的情况下,它们都暗示它们具有相同的处理器,但显然它们之间存在差异。额外的一条信息,我认为所有无法加载预编译 dll 的机器都有标签“intel Core i5”。
  • 继续我之前的评论:我们可以使用“Intel core i5”处理器(这似乎是一个无法使用现有 dll 的处理器)生成 dll,但其他 dll 应该是什么包含在分发中?注意:发行版还包括源代码,它允许最终用户自己编译一个 dll,但这给最终用户带来了很多责任。
  • 您最好的选择,除非您正在执行性能关键处理,否则为“最低公分母”CPU 架构生成所有库。事情可能会运行得慢一点,但它们会运行。对于 GCC,-march 标志可以设置为类似 core2(参见 gcc.gnu.org/onlinedocs/gcc-4.5.3/gcc/…),对于 MS 编译器,参见 stackoverflow.com/questions/23259531/… 这比尝试提供特定于体系结构的库要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多