将32位库链接到64位程序

20

我有一个仅提供32位二进制库的.so文件,并且我需要生成一个使用它的64位程序。是否有一种方法可以将其封装或转换,以便可以与64位程序一起使用?


1
我本来想建议重新编译针对64位的库代码,但我觉得你没有它的源代码...我怀疑64位代码能否在32位之间进行“thunk”..也许在Linux的gcc下可以?但是这种“thunking”是Win95的一个特性(还记得吗?)32位代码调用16位代码...你尝试过链接64位代码引用32位动态库(.so)并运行它吗? - t0mm13b
现代的64位操作系统中没有任何“thunking”等效物。这样是行不通的。 - Reed Copsey
从未尝试过,但通过反编译库到C代码可能是可行的,然后您可能需要进行一些修改。然后将其编译为64位... - Kapandaria
3个回答

31

不行。你不能在64位程序中直接链接到32位代码。

最好的选择是编译一个32位(独立)程序,在你的64位平台上运行(使用ia32),然后使用一种进程间通信形式从你的64位程序与它进行通信。


3
那么,Win95是如何处理从32位代码调用16位代码的过渡,即“thunking”的呢?这是在汇编语言级别上通过改变堆栈指针和寄存器来实现的吗? - t0mm13b
7
操作系统在这方面做了明确的处理,但是Linux或现代64位Windows操作系统中没有相应的功能,所以您需要使用我发布的解决方法来实现。 - Reed Copsey
@Reed:你会推荐哪种IPC机制?我认为共享内存应该比管道或Unix域套接字快得多。 - anon
那真是太遗憾了。Thunking 是一种非常有用的技术,可以使您能够从32位应用程序调用16位 dll,或者在我遇到的一个情况下,我需要从16位应用程序调用32位 dll。不幸的是,现代操作系统不为32/64位代码提供该功能。我想这可能是有原因的...也许是复杂性。 - hookenz
2
x86_64使用不同的调用约定,与x86不同,以及不同数量的寄存器(双倍),使得将这两种架构全部链接在一起更加困难。 - phuclv

5

如果要使用IPC从64位代码运行32位插件的示例,请查看开源NSPluginWrapper


4
可以实现,但需要进行一些神奇的操作,而且你可能不会喜欢答案。要么模拟一个32位CPU(我不是在开玩笑),要么将主进程切换回32位。虽然模拟可能会很慢。

这是该技术的概念证明

然后保持对32位库的每个内存访问进行表格记录,并使它们保持同步。理论上完美非常困难,但可行的方案应该相当容易,但非常繁琐。

在大多数情况下,我认为两个进程然后通过IPC通信可能是最简单的方法,正如其他人建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接