在64位c++程序中使用32位库

Using 32-bit library in 64-bit C++ program

本文关键字:32位库 程序 64位 c++      更新时间:2023-10-16

是否有办法使用旧的32位静态库*。64位系统中的A。没有机会获得这个旧库的源代码来重新编译它。我也不想在gcc中使用-m32,因为该程序使用许多64位库。谢谢。

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

在x86平台上,不能将32位库链接到64位可执行文件。如果您确实需要使用该库,则需要启动一个单独的32位进程来处理对库的调用,并使用某种形式的IPC在64位应用程序和该辅助进程之间传递这些调用。事先警告:这很麻烦。在开始这条路之前,请确保确实需要这个库。

在x86/x86_64平台上,您不能这样做。我的意思是,如果你为你想调用的每个32位函数编写自定义的汇编语言包装器,也许你可以。但这是唯一可能的方法。即使你愿意做那件事,我也不确定它会成功。

这样做的原因是调用约定完全不同。x864_64平台有更多的寄存器可以使用,所有操作系统的64位ABI(应用程序二进制接口,基本上是如何传递参数,如何设置堆栈帧和类似的东西)标准都使用这些额外的寄存器来传递参数等。

这使得32位和64位x86/x86_64系统的ABI完全不兼容。你需要写一个转换层。有可能32位ABI允许32位代码篡改64位代码不允许篡改的CPU内容,这将使您的工作更加困难,因为您需要在返回64位代码之前恢复可能被修改的状态。

这还没有讨论指针的问题。如何将指向64位地址的数据结构的指针传递给32位代码?

简单回答:你不能。

您需要使用-m32才能加载32位库。

最好的方法可能是创建一个封装库的服务器。然后,64位应用程序可以使用IPC(各种方法,例如套接字,fifo)来与承载库的进程通信。

在Windows上,这将被称为进程外COM。我不知道unix上是否有类似的框架,但是同样的方法可以工作。