【问题标题】:Load 32-bit shared library from 64-bit application?从 64 位应用程序加载 32 位共享库?
【发布时间】:2023-03-07 08:57:01
【问题描述】:

我有一个编译为 32 位的共享库。我可以在 64 位应用程序中使用它还是需要将共享库也编译为 64 位?

【问题讨论】:

  • 什么操作系统?这可能很重要。
  • @Paul:实际上应该没关系。假设 x86-64,任何给定点的处理器都处于长模式(64 位)、保护模式(32 位)或实模式(16 位)。当一个线程被调度时,模式被设置为匹配只能是其中之一的进程。这是 x86/x86-64 如何在其核心工作的问题。
  • +1 用于提出看似显而易见的问题,但这让它变得非常明显。

标签: c++ shared-libraries


【解决方案1】:

不,您不能通过常规方式在 64 位应用程序中加载 32 位库。

那里有一些巧妙的技巧,例如拥有一个 32 位应用程序,它可以加载库并通过 IPC 接口导出函数,但如果您可以选择将库编译为 64 位,那就是最好的选择。

【讨论】:

  • 你提到的这个聪明的 hack 仍然在 32 位进程中加载​​ DLL。你知道这些在 64 位进程中加载​​ 32 位 DLL 的黑客吗?
  • @John:什么都行。您当然可以在进程中分配内存并手动将 32 位 dll 中的二进制代码读入其中。但处理器会将其视为无法正常运行的 64 位指令。 x86-64/x86 架构根本无法做到这一点。
【解决方案2】:

您不能从 64 位应用程序动态或静态加载 32 位库,反之亦然。

我知道有许多解决方法:

  1. 制作 64 位版本的 DLL
  2. 制作 32 位版本的应用程序
  3. 引入 COM 代理对象(也称为代理)作为通信中介。 Described here
  4. 将 DLL 托管在单独的(32 位)EXE 中并使用 IPC 技术

有许多进程间通信 (IPC) 技术。以下是几个例子:

【讨论】:

  • +1,即使 IPC 技术列表中缺少共享内存、共享文件、数据库表、RFC、COM 和视频屏幕戳;)换句话说:我建议“有一个进程间通信 (IPC) 技术的数量:”您添加了“其中一些是:”短语。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2014-08-23
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多