将 32 位库链接到 64 位程序

Posted

技术标签:

【中文标题】将 32 位库链接到 64 位程序【英文标题】:Linking 32-bit library to 64-bit program 【发布时间】:2010-12-28 22:59:41 【问题描述】:

我有一个 32 位 .so 纯二进制库,我必须生成使用它的 64 位程序。 有没有办法包装或转换它,以便它可以与 64 位程序一起使用?

【问题讨论】:

我打算建议重新编译针对 64 位的库代码,但给人的印象是你没有它的源代码……我怀疑 64 位代码是否可以“转换”到 32 位。 .也许它可以在linux的gcc下?但话又说回来,这个“thunking”是 Win95 的一个特性(还记得吗?) 32 位代码调用 16 位代码……你试过链接引用 32 位动态库(.so)的 64 位代码并运行它吗? 在任何现代 64 位操作系统中都没有等效的“thunking”。这行不通。 从未尝试过,但可以通过将库反编译为 c 代码,然后您可能需要进行一些修改。然后编译成64位... 【参考方案1】:

没有。您不能直接链接到 64 位程序中的 32 位代码。

最好的选择是编译一个可以run on your 64bit platform (using ia32)的32位(独立)程序,然后使用一种进程间通信的形式从你的64位程序与它通信。

【讨论】:

@Reed:那么 Win95 是如何管理从 32 位代码转换为 16 位代码的?是在汇编程序级别围绕堆栈指针和寄存器进行更改吗? 操作系统明确地处理了这个问题,但是在 Linux 或现代 64 位 Windows 操作系统中没有任何允许这样做,所以你必须使用我发布的解决方法。 @Reed:感谢您回答我的问题。 :) @Reed:您会推荐哪种 IPC 机制?我认为共享内存应该比例如更快。管道或 Unix Doman 套接字。 x86_64 使用与 x86 不同的调用约定,以及不同数量的 regiters (double) 使得将两种架构链接在一起变得更加困难【参考方案2】:

这是可能的,但并非没有幕后的一些严肃魔法,你不会喜欢这个答案。要么模拟 32 位 CPU(不,我不是在开玩笑),要么将主进程切换回 32 位。不过模拟可能很慢。

This is a proof of concept 的技术。

然后保持一个每个对 32 位库的内存访问的表,并使它们保持同步。很难达到理论上的完整性,但可行的东西应该很容易,但很乏味。

在大多数情况下,我相信两个进程,然后两者之间的 IPC 实际上可能是最简单的,正如所建议的那样。

【讨论】:

【参考方案3】:

有关使用 IPC 从 64 位代码运行 32 位插件的示例,请查看开源 NSPluginWrapper。

【讨论】:

以上是关于将 32 位库链接到 64 位程序的主要内容,如果未能解决你的问题,请参考以下文章

此错误是由运行在 32 位 JVM 中的 Java 程序访问的 64 位库引起的吗?

在 OS X 上将 32 位二进制库包装到 64 位库

ubuntu64运行32位程序安装过程

为 32 位 exe 加载 32 位库时,Windows 7 64 位路径不正确

无法在 64 位 ubuntu 上安装 32 位库

32位和64位可以一起工作吗?