2011-04-19 188 views
13

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

+1

什么操作系统?这可能很重要。 – 2011-04-19 18:29:06

+0

Windows 7和Red Hat Linux。 – Brian 2011-04-19 18:30:56

+1

@保罗:实际上应该没关系。假定x86-64,处理器在任何给定点处于长模式(64位),保护模式(32位)或实模式(16位)。当一个线程被调度时,该模式被设置为匹配只能是其中之一的进程。这是x86/x86-64如何工作的核心问题。 – 2011-04-19 19:07:37

回答

13

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

这里有一些聪明的黑客,比如有一个32位应用程序加载库并通过IPC接口导出函数,但是如果您有选择将库编译为64位,那么这是是迄今为止最好的选择。

+0

您提到的这个巧妙的破解仍然在32位进程中加载​​DLL。你是否知道这些在64位进程中加载​​32位DLL的黑客? – 2011-04-19 21:06:46

+1

@约翰:没有什么可行的。你当然可以做一些事情,比如在你的进程中分配内存,并手动读取32位dll中的二进制代码。但处理器会将其视为无法正常运行的64位指令。它不能用x86-64/x86架构完成。 – 2011-04-19 21:20:23

5

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

有许多变通的,我知道的:

  1. 充分利用DLL的64位版本
  2. 使该应用程序的32位版本
  3. 介绍一COM代理对象(也称为代理)作为通信中介。 Described here
  4. 主机的DLL在一个单独的(32位)和EXE使用IPC技术

有许多的进程间通信(IPC)的技术。这里有几个例子:

+2

+1,尽管IPC技术列表中缺少共享内存,共享文件,数据库表,RFC,COM和视频屏幕戳);换句话说:我建议“有一些进程间通信IPC)技术:“您添加了”其中一些是:“短语。 – TheBlastOne 2012-10-17 16:02:30

相关问题