在64位的C++程序中使用32位库

7

在64位系统中,如何使用一个旧的32位静态库*.a?因为没有源代码重新编译这个旧库的机会。同时,我也不想在gcc中使用-m32选项,因为程序使用了许多64位库。


你可以在代码中附带一个小型的32位虚拟机,并将库函数调用分派到其中... - Kerrek SB
2
@Kerrek:不需要虚拟机,只需要进程间通信。 - Ben Voigt
4个回答

7
这完全取决于您运行的平台。例如,在PowerPC上的OS X,它会" Just Work"。

在x86平台上,您无法将32位库链接到64位可执行文件中。如果您确实需要使用该库,则需要启动单独的32位进程来处理您对该库的调用,并使用某种IPC在您的64位应用程序和该帮助程序之间传递这些调用。请注意:这是很麻烦的。在开始这条路之前,请确保您真正需要该库。


1
64位Windows可以很好地运行32位代码,只要它在32位用户模式进程中。 - Ben Voigt
@Ben Voigt:我认为它是在模拟器中运行的。我不太熟悉WOW64的细节,因此不知道Windows上的64位和32位进程之间可用的IPC通信形式是什么。 - Stephen Canon
@Stephen:想想WINE(不是模拟器)。WOW64大致上是相同的机制,提供一组32位库来调用特定于操作系统的系统调用。 - Ben Voigt
@Stephen:如果你不了解WOW64的细节,那么你就没有资格判断它是否“完全相同”。 - Ben Voigt
1
@Ben Voigt:一个运行32位进程的64位操作系统与在同一地址空间调用彼此的32位和64位代码是完全不同的两个概念。 - Omnifarious
@Omnifarious:请查看编辑历史记录。如果您查看Stephen的原始声明,我的评论是完全有道理的。 - Ben Voigt

1
在x86/x86_64平台上,你不能这样做。我的意思是,也许你可以为每个想要调用的32位函数编写自定义汇编语言包装器,但那是唯一可行的方式。即使你愿意付出那样的努力,我也不确定它是否会起作用。
原因是调用约定完全不同。x864_64平台有更多的寄存器可供使用,而所有操作系统的64位ABI(应用二进制接口,基本上是如何传递参数,设置堆栈帧等)都利用了这些额外的寄存器来传递参数等。
这使得32位和64位x86/x86_64系统的ABI完全不兼容。你需要编写一个翻译层。而且32位ABI可能允许32位代码摆弄CPU的东西,而64位代码不允许摆弄这些东西,这将使你的工作更加困难,因为你需要在返回到64位代码之前还原可能修改过的状态。
而且这还没有涉及指针的问题。如何将指向坐标在64位地址处的数据结构的指针传递给32位代码?

0
简单的回答是:你不能。

1
这在技术上算是一个答案,但稍微解释一下会更好。 - Tim Post

0

为了加载一个32位的库,你需要使用-m32

可能最好的办法是创建一个包装库的服务器。然后,64位应用程序可以使用IPC(各种方法,例如套接字、命名管道)与托管库的进程进行通信。

在Windows上,这将被称为out-of-process COM。我不知道Unix上是否有类似的框架,但同样的方法也适用。


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